关于List中toArray()和toArray(T[])的问题
近日在学习项目代码的时候,在写 List 中的 toArray() 方法,经常会犯错,通常想把一个list转化为自己想要的对象类型数组时就会调用 List.toArray()方法,此方法经常会误用:
1 public static void main(String[] args){ 2 List<String> list = new ArrayList<String>(); 3 list.add("a"); 4 list.add("b"); 5 list.add("c"); 6 //此处运行时会报 错 7 String[] strs = (String[]) list.toArray(); 8 for(String str : strs ) 9 System.out.println(str); 10 }
我们经常想用第7行代码来进行list到对象数组的转换,但是会报ClassCastException,开始并不知道为什么会报错,后面看了下 ArrayList中 关于 toArray()的源码:
1 public Object[] toArray() { 2 return Arrays.copyOf(elementData, size); 3 }
看了上面的源码,瞬间就明白了, 此方法返回的是一个Object类型的数组,数组中存着List中的数据,但是我们强转为String[]是错误的,因为父类对象数组是不能够强制转化为子类对象数组的的 ,道理很简单,因为 Object[] 里面可以存的是任意类型的对象,而这些对象不一定能转为 String 类型,所以会运行时提示强制的异常。
而 List 中的 toArray(T[]) 很好地满足我们的需要,下面是关于它的源码:
1 public <T> T[] toArray(T[] a) { 2 if (a.length < size) 3 // Make a new array of a's runtime type, but my contents: 4 return (T[]) Arrays.copyOf(elementData, size, a.getClass()); 5 System.arraycopy(elementData, 0, a, 0, size); 6 if (a.length > size) 7 a[size] = null; 8 return a; 9 }
从上面的代码可知道,当我们调用toArraay(T[])方法的时候,会根据参数的具体类型,返回一个此类型的对象数组,此时不会再出现类型强制的错误了,如下:
1 public static void main(String[] args){ 2 List<String> list = new ArrayList<String>(); 3 list.add("a"); 4 list.add("b"); 5 list.add("c"); 6 //使用带参数的toArray方法 7 String[] strs = list.toArray(new String[0]); 8 for(String str : strs ) 9 System.out.println(str); 10 }

浙公网安备 33010602011771号