关于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 }

 

posted @ 2016-08-11 14:39  itoysk  阅读(572)  评论(0)    收藏  举报