java stringtoarray_java中toArray()的用法
一直不太熟悉toarray()的用法 现整理如下
一.Incident
public static void main(String[] args) {
List list = new ArrayList();
list.add("1");
list.add("2");
String[] tt = (String[]) list.toArray(new String[0]);
}
这段代码是没问题的,但我们看到String[] tt =(String[]) list.toArray(new String[0]) 中的参数很奇怪,然而去掉这个参数new String[0]却在运行时报错.
二. Root Cause Analysis
经研究发现toArray有两个方法:
public Object[] toArray() {
Object[] result = new Object[size];
System.arraycopy(elementData, 0, result, 0, size);
return result;
}
不带参数的toArray方法,是构造的一个Object数组,然后进行数据拷贝,此时进行转型就会产生ClassCastException,这也就是上述问题的root cause了。
public Object[] toArray(Object a[]) {
if (a.length
a = (Object[]) java.lang.reflect.Array.newInstance(a.getClass().getComponentType(), size);
System.arraycopy(elementData, 0, a, 0, size);
if (a.length > size)
a[size] = null;
return a;
}
而带参数的toArray方法,则是根据参数数组的类型,构造了一个对应类型的,长度跟ArrayList的size一致的空数组,虽然方法本身还是以 Object数组的形式返回结果,不过由于构造数组使用的ComponentType跟需要转型的ComponentType一致,就不会产生转型异常。
三. Solutions
因此在使用toArray的时候可以参考以下三种方式
1. Long[] l = new Long[];
list.toArray(l);
2. Long[] l = (Long[]) list.toArray(new Long[0]);
3. Long[] a = new Long[];
Long[] l = (Long[]) list.toArray(a);
四.Further Consideration
该容器中的元素已经用泛型限制了,那里面的元素就应该被当作泛型类型的来看了,然而在目前的java中却不是的,当直接String[] tt =(String[]) list.toArray()时,运行报错。回想一下,应该是java中的强制类型转换只是针对单个对象的,想要偷懒,将整个数组转换成另外一种类型的数组是不行的,这和数组初始化时需要一个个来也是类似的。
java stringtoarray_java中toArray()的用法相关推荐
- Java程序中Timer的用法
Java程序中Timer的用法 import java.io.IOException; import java.util.Timer; public class CheckTimer {/*** @p ...
- java stream中Collectors的用法
文章目录 简介 Collectors.toList() Collectors.toSet() Collectors.toCollection() Collectors.toMap() Collecto ...
- java中toarray()的 用法_java容器中toArray的用法
请高手帮我看看toArray的用法其返回的是哈希码是不是需要重写importjava.util.*;publicclassTest1{publicstaticvoidmain(String[]args ...
- java项目中enum的用法_java中enum的用法
本文实例讲述了java中enum的用法.分享给大家供大家参考.具体分析如下: 1. 基本用法 enum Day { SUNDAY, MONDAY, TUESDAY, WENDSDAY, THURSDA ...
- java jna_Java中jna的用法
(1)jna是对jni的封装,让java使用者能更好的使用本地的动态库 (2)使用jna需要下载jna的jar包,该jar包就是对jni的封装,所以在调用效率上来讲,jna是要比jni低一点的,不过对 ...
- java new_Java中new的用法
Java语言中,new的作用是为一个对象(Object)分配内存,代码清单1-1说明了为各种Object分配内存的方法. 代码清单1-1 为各种Object分配内存的方法 int a = 20; ...
- java typeof_js中typeof的用法汇总
JavaScript中的typeof其实非常复杂,它可以用来做很多事情,但同时也有很多怪异的表现.本文列举出了它的多个用法,而且还指出了存在的问题以及解决办法. > typeof undefin ...
- java string中indexOf()常用用法
Java中字符串中子串的查找共有四种方法,如下: 1.int indexOf(String str) :返回第一次出现的指定子字符串在此字符串中的索引. 2.int indexOf(String st ...
- java datainputstream_Java中DataInputStream的用法
展开全部 1.DataOutputStream:数据输出流允许e5a48de588b63231313335323631343130323136353331333337396239应用程序以适当方式将基 ...
最新文章
- 查看CPU是i386架构和x86_64架构
- python 文本聚类算法
- 肝!2500字 字符串专题总结
- 剖析Disruptor:为什么会这么快?(一)锁的缺点
- GooglePR说明
- Android Get方式发送信息
- 编程计算机教小明加法,Python校本课程第四课——教案
- 一号教学楼供配电设计
- 国产开源数据库建模工具
- 2022美赛D题题目及思路--数据瘫痪
- TypeScript-打包
- Windows bat 编程基本语法
- 麻雀要革命2 第31节:不共戴天之仇
- 企业IT咨询和信息化规划方法
- 上海“生煎”地图大公开
- 直播预告:对神经网络对抗鲁棒性正则化的认识 | AI TIME PhD
- Apache模块的方式安装PHP
- anconda 下的pip路径_修改conda环境和缓存默认路径/修改Python 的 pip install 默认安装依赖路径/提高conda安装速度,其实就是改了下载源。...
- Linux 字符设备
- Soul应用提取聊天记录【2021年中】