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 的长度区别!