一直不太熟悉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()的用法相关推荐

  1. Java程序中Timer的用法

    Java程序中Timer的用法 import java.io.IOException; import java.util.Timer; public class CheckTimer {/*** @p ...

  2. java stream中Collectors的用法

    文章目录 简介 Collectors.toList() Collectors.toSet() Collectors.toCollection() Collectors.toMap() Collecto ...

  3. java中toarray()的 用法_java容器中toArray的用法

    请高手帮我看看toArray的用法其返回的是哈希码是不是需要重写importjava.util.*;publicclassTest1{publicstaticvoidmain(String[]args ...

  4. java项目中enum的用法_java中enum的用法

    本文实例讲述了java中enum的用法.分享给大家供大家参考.具体分析如下: 1. 基本用法 enum Day { SUNDAY, MONDAY, TUESDAY, WENDSDAY, THURSDA ...

  5. java jna_Java中jna的用法

    (1)jna是对jni的封装,让java使用者能更好的使用本地的动态库 (2)使用jna需要下载jna的jar包,该jar包就是对jni的封装,所以在调用效率上来讲,jna是要比jni低一点的,不过对 ...

  6. java new_Java中new的用法

    Java语言中,new的作用是为一个对象(Object)分配内存,代码清单1-1说明了为各种Object分配内存的方法. 代码清单1-1 为各种Object分配内存的方法 int a = 20;    ...

  7. java typeof_js中typeof的用法汇总

    JavaScript中的typeof其实非常复杂,它可以用来做很多事情,但同时也有很多怪异的表现.本文列举出了它的多个用法,而且还指出了存在的问题以及解决办法. > typeof undefin ...

  8. java string中indexOf()常用用法

    Java中字符串中子串的查找共有四种方法,如下: 1.int indexOf(String str) :返回第一次出现的指定子字符串在此字符串中的索引. 2.int indexOf(String st ...

  9. java datainputstream_Java中DataInputStream的用法

    展开全部 1.DataOutputStream:数据输出流允许e5a48de588b63231313335323631343130323136353331333337396239应用程序以适当方式将基 ...

最新文章

  1. 查看CPU是i386架构和x86_64架构
  2. python 文本聚类算法
  3. 肝!2500字 字符串专题总结
  4. 剖析Disruptor:为什么会这么快?(一)锁的缺点
  5. GooglePR说明
  6. Android Get方式发送信息
  7. 编程计算机教小明加法,Python校本课程第四课——教案
  8. 一号教学楼供配电设计
  9. 国产开源数据库建模工具
  10. 2022美赛D题题目及思路--数据瘫痪
  11. TypeScript-打包
  12. Windows bat 编程基本语法
  13. 麻雀要革命2 第31节:不共戴天之仇
  14. 企业IT咨询和信息化规划方法
  15. 上海“生煎”地图大公开
  16. 直播预告:对神经网络对抗鲁棒性正则化的认识 | AI TIME PhD
  17. Apache模块的方式安装PHP
  18. anconda 下的pip路径_修改conda环境和缓存默认路径/修改Python 的 pip install 默认安装依赖路径/提高conda安装速度,其实就是改了下载源。...
  19. Linux 字符设备
  20. Soul应用提取聊天记录【2021年中】

热门文章

  1. Flink从入门到精通100篇(二十二)- Flink应用实战案例:如何实现网络流控与反压机制
  2. 深入推荐引擎相关算法 - 聚类
  3. 进度条模块tqdm介绍
  4. 【算法与数据结构】在n个数中取第k大的数(基础篇)
  5. 统计学习及监督学习概论
  6. 阅读源代码的一点小技巧
  7. elasticSearch6源码分析(10)SettingsModule
  8. 机器学习系列之手把手教你实现一个分类回归树
  9. 大型web系统数据缓存设计-l转载
  10. Spring AOP 实现原理与 CGLIB 应用--转