1ArrayList之toArray:
toArray有两个重载的方法:
(1)list.toArray();
(2)list.toArray(T[] a);
第一个是,将list直接转为Object[] 数组;
第二个,是将list转化为你所需要类型的数组,当然我们再用的时候会转化为与list内容相同的类型。
举个例子:
Collection<String> arr = new ArrayList<String>();
arr.add("a");
arr.add("b");
arr.add("b");//可以添加重复的对象
System.out.println(arr);
String[] str = (String[])arr.toArray();//erro
运行结果如下:
[a, b, b]
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
at cn.wiztek.reiss.dy.service.impl.DyServiceImpl.main(DyServiceImpl.java:2242)
不能将Object[] 转化为String[],转化的话只能是取出每一个元素再转化。
只能这样:
Collection<String> arr = new ArrayList<String>();
arr.add("a");
arr.add("b");
arr.add("b");//可以添加重复的对象
System.out.println(arr);
Object[] o = arr.toArray();
for (int i = 0; i < o.length; i++) {
String e = (String) o[i];
System.out.println(e);
}
运行结果:
[a, b, b]
a
b
b
这说明用第一种方法是不太好使的,那我们用第二种方法试一下:
Collection<String> arr = new ArrayList<String>();
arr.add("a");
arr.add("b");
arr.add("b");//可以添加重复的对象
System.out.println(arr);
String[] obj1 = arr.toArray(new String[arr.size()]);//第二种方法
System.out.println(obj1);
}
运行结果:
[a, b, b]
[Ljava.lang.String;@2429de03
关于这个一串,这样理解:
([:表示一维数组 。
[[:表示二维数组 。
L:表示一个对象 。
java.lang.String:表示对象的类型 。
@:后面表示该对象的hashCode。
因此访问数组元素时,需要另外使用for循环遍历数组,不能直接通过数组名访问所有数组元素。)
如果觉得遍历很麻烦,可以重写toString方法(还是得写遍历啊!),代码附上:
public static String toString(Object o){
if (o instanceof String){
return String.valueOf(o);
}else if (o instanceof Object[]){
String str = "";
for (Object obj : (Object[])o){
str +=String.valueOf(obj);
}
return str;
}
return "";
}
运行 toString(obj1),得到结果是:
a, b, b]
abb
可以看出,不带参数的toArray()方法,是构造的一个Object数组,然后进行数据copy,此时进行转型就会产生ClassCastException
而带参数的toArray(T[] a) 方法,则是根据参数数组的类型,构造了一个对应类型的,长度跟ArrayList的size一致的空数组,虽然方法本身还是以 Object 数组的形式返回结果,不过由于构造数组使用的ComponentType跟需要转型的ComponentType一致,就不会产生转型异常。
在复习一遍!
list.toArray();
String[] str = (String[])arr.toArray();//erro
会出错,会出错!
String[] str = arr.toArray( new String [arr.size] );
根据参数数组的类型,构造了一个对应类型的,长度跟ArrayList的size一致的空数组,
没问题。
记住了吗?