java.util.List.toArray() 使用体会

下面的代码执行后:

[java]view plaincopy

    privatevoidonButtonListToArrayClick(){//Array—>ListString[]strArray=newString[]{"aa","bb"};List<String>list=newArrayList<String>(Arrays.asList(strArray));list.add("cc");//List—>ArrayString[]strArray2;try{strArray2=(String[])list.toArray();}catch(Exceptione){Log.i("ToArray","failure:"+e.getMessage());}}

异常发生

原因为list.toArray()返回的是Object类型,强制转换的时候发生ClassCastException

程序修改如下:

[java]view plaincopy

    privatevoidonButtonListToArrayClick(){//Array—>ListString[]strArray=newString[]{"aa","bb"};List<String>list=newArrayList<String>(Arrays.asList(strArray));list.add("cc");//List—>ArrayString[]strArray2=null;try{strArray2=list.toArray(newString[0]);}catch(Exceptione){Log.i("ToArray","failure:"+e.getMessage());}for(Stringelement:strArray2){Log.i("ToArray","strArray2:"+element);}}

运行结果:

上面的方法

[java]view plaincopy

    strArray2=list.toArray(newString[0]);

与下面的方法一样[java]view plaincopy

    strArray2=newString[list.size()];strArray2=list.toArray(strArray2);

备注:

下面是ArrayList的两个toArray()方法的源代码:

[java]view plaincopy

    publicObject[]toArray(){Object[]result=newObject[size];System.arraycopy(elementData,0,result,0,size);returnresult;}publicObject[]toArray(Objecta[]){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;returna;}

①不带参数的toArray方法,是构造的一个Object数组,然后进行数据拷贝,此时进行转型就会产生ClassCastException

②带参数的toArray方法,则是根据参数数组的类型,构造了一个对应类型的,长度跟ArrayList的size一致的空数组,虽然方法本身还是以 Object数组的形式返回结果,不过由于构造数组使用的ComponentType跟需要转型的ComponentType一致,就不会产生转型异常

————————————————————————————————————————-

总结:1. 数组的定义和初始化是可以分开的,不能因为经常见到的数组的定义和初始化连在一起操作就混淆,定义如下:

数据类型【】数组名 = new 数据类型 【数组长度】;

2. 此博主的博文条理清晰明了,有理有据,是小白学习的好棒样(⊙o⊙)哦~~~

天才是百分之一的灵感加上百分之九十九的努力

java.util.List.toArray() 使用体会

相关文章:

你感兴趣的文章:

标签云: