toArray()和toArray(Object a[ ]) 区别

时间:2022-09-11 10:40:12

List 转换为数组

先介绍俩个正确的方法:

方法一:

String[]  arr = new String[list.size];
list.toArray(arr);
//此时arr就有了list中的值了


方法二 :

String[] arr = (String[])list.toArray(new String[0]);
//这里 0 这个参数有意思了,后面的源代码可以看出


读者可能会想 为啥要这么麻烦,直接 toArray() 不是省事儿!

那我们看看方法三:

ArrayList list = new ArrayList();  
	list.add("1");  
	list.add("2");  
	list.add("3");   
	String[] arr =(String[]) list.toArray();
for(String i : arr)  
     System.out.println(i);

编译通过,但运行异常!

  java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;

类型转换错误。。。对象不能转换为字符串


由此我们引入 toArray()和toArray(Object a[ ]) 的源代码:

public Object[] toArray() {

   Object[] result = new Object[size];  //这里的size 是 被转换者list 的 size
   System.arraycopy(elementData, 0, result, 0, size);
   return result;

}

 

public Object[] toArray(Object a[]) {

   //这里的size 是 被转换者list 的 size
   if (a.length < size)
       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;

}


从源代码可以看出,要是参数数组 a 的 length < size,则 a 会根据反射机制重新得到一个长度为 size 的 a,然后再执行 System.arraycopy 复制被转换者 list 的数据给 a ,但是要是参数数组 a 的 length > size , 这时候注意了!!!!

a[size] = null ,这个值为 null 。但 a[ size + 1 ], a[ size + 2 ] , a[ size + 3 ] …… 还是数组 a 原来的值。

即    a[ 0 ]  ……   a[ size - 2 ] , a[ size - 1 ]    和    a[ size + 1 ], a[ size + 2 ] , a[ size + 3 ] …… 还是数组 a 原来的值;

但  a[size] = null  。


好了,上个代码就能懂了:

ArrayList list = new ArrayList();
list.add("1");
list.add("2");
list.add("3");
String[] arr =(String[]) list.toArray(new String[]{"壹","贰","叁","肆","伍"});
for(String i : arr)
System.out.println(i);

// 输出

1

2

3

null


总结

List转换为数组 最好用 toArray( Object a[] ) 方法!而且要特别注意源对象 List 长度和参数数组 a 的长度区别!