ArrayList 的toArray的转换数组方法的注意事项

toArray()一共有两个方法 toArray(T[] a) 和toArray() 源码是

 

 

 

进行使用toArray()方法时候,使用 (String[]) 强转会出现 java.lang.ClassCastException 转换异常

 

 

toArray()返回的数组是Object[] 数组,不能使用 (String[]) 强转的方法强转数组内的元素。不带参数的toArray方法,是构造的一个Object数组,然后进行数据拷贝,此时进行转型就会产生ClassCastException转换异常

java中的强制类型转换只是针对单个对象的,想要偷懒,将整个数组转换成另外一种类型的数组是不行的,这和数组初始化时需要一个个来也是类似的。

用Object[]数组来接收返回值,不进行强转,对于String 也是可以输出值的

 

 

 

 

toArray(T[] a) 方法 源码

   @SuppressWarnings("unchecked")
   public <T> T[] toArray(T[] a) {
       if (a.length < size)
           // Make a new array of a's runtime type, but my contents:
           return (T[]) Arrays.copyOf(elementData, size, a.getClass());
       System.arraycopy(elementData, 0, a, 0, size);
       if (a.length > size)
           a[size] = null;
       return a;
  }

 

1..当参数数组的长度不小于集合中元素的个数的时候,将集合中的元素按顺序拷贝到参数数组中,并且如果参数数组的长度大于集合中元素的个数的时候, a[size] = null;-------接跟着拷贝后最后一个元素的数组项会被设置为null(参数数组中的数据项是发生了改变了的).

2.当参数数组的长度小于集合中元素的个数的时候,重新分配一个长度和集合中元素的个数相同的新数组,然后将集合中的元素全部拷贝到这个新数组中,并返回这个新数组,新数组的类型和参数类型是一致的(参数数组中的数据项是没有任何改变的)。

3.需要注意的是toArray(new Object[0])和toArray()产生的效果是一模一样的

 String[] strings1 =strings.toArray(new String[0]);
       Arrays.sort(strings1);
       for (String s:strings1){
           System.out.println(s);
      }

 

 

posted on 2021-11-21 20:10  Forever、H  阅读(382)  评论(0)    收藏  举报