如何把ArrayList的对象转化为数组,toArray()怎么用啊?

时间:2021-06-13 19:36:13
我这段代码有什么问题吗?
ArrayList list1 = new ArrayList();
for(int i=0; i<20; i++){
list1.add(i+ "hello");
}
String[] str = (String[])list1.toArray();

运行的时候报Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object;
at TestArrayList.main(TestArrayList.java:10)

10 个解决方案

#1


用String[] str=(String[])(list1.toArray())试试

#2


类型cast错误
list1.toArray()返回的是Object[]类型
注意Object[]本身就是一个对象,他的每一个element是Object。这里的element实际上是String
String[]也是一个对象,他的element是String
但注意,Object[]是不可以cast成String[]的,他们没有任何继承关系,虽然他们的element类型可能相同,但两个数组之间不可以随意cast

改成:
Object[] array=list1.toArray();
使用时再cast
for(int i=0;i<array.length;i++){
  String str=(String)array[i];
  System.out.println(str);
}

#3


只需要把这句话
String[] str = (String[])list1.toArray();
改成
String[] str = (String[])list1.toArray(new String[0]);
就可以了。
查看javadoc:

Object[] toArray() 
          返回一个按照正确的顺序包含此列表中所有元素的数组。 
    其返回的是Object[]数组,当进行类型cast的时候出错,我想可能是因为不能一次性将一个数组中所有元素的类型都cast,需要一个一个的cast?

<T> T[] 
 toArray(T[] a) 
          返回一个按照正确的顺序包含此列表中所有元素的数组;返回数组的运行时类型就是指定数组的运行时类型。 
这个函数返回的是T[]类型的数组,本例中就是String[].
          因此应该使用这个接口。

#4


那干脆
String[] v=new String[list1.size()];
v=list1.toArray(v);

#5


没有必要再多加一句话吧

#6


实际上这句话的处理是少不了的
如果不用String[] v=new String[list1.size()];List会通过反射自己生成一个String[],加上参数中的那个String[],实际上反而多构造了一个。反射这东西相对来说有点耗资源。

#7


String[] str = new String[list1.size()];
        str = (String[])list1.toArray(str);

        for(int i=0; i<20; i++)
            System.out.println(str[i]);

#8


to : fool_leave() 
在参数中new String[0],只是构造了一个空的数组而已啊。不会造成多大的资源浪费吧。

#9


String[0]虽然是一个空数组,但它仍然是一个实例,和new String("")一样的道理
浪费其实不大,而toArray方法里面用的反射相对来说消耗的要多一些。
我说把String[] v=new String[list1.size()];拿出来也不过是多给个选择,如果不是频繁调用,这点开销根本不用考虑。

#10


:)

#1


用String[] str=(String[])(list1.toArray())试试

#2


类型cast错误
list1.toArray()返回的是Object[]类型
注意Object[]本身就是一个对象,他的每一个element是Object。这里的element实际上是String
String[]也是一个对象,他的element是String
但注意,Object[]是不可以cast成String[]的,他们没有任何继承关系,虽然他们的element类型可能相同,但两个数组之间不可以随意cast

改成:
Object[] array=list1.toArray();
使用时再cast
for(int i=0;i<array.length;i++){
  String str=(String)array[i];
  System.out.println(str);
}

#3


只需要把这句话
String[] str = (String[])list1.toArray();
改成
String[] str = (String[])list1.toArray(new String[0]);
就可以了。
查看javadoc:

Object[] toArray() 
          返回一个按照正确的顺序包含此列表中所有元素的数组。 
    其返回的是Object[]数组,当进行类型cast的时候出错,我想可能是因为不能一次性将一个数组中所有元素的类型都cast,需要一个一个的cast?

<T> T[] 
 toArray(T[] a) 
          返回一个按照正确的顺序包含此列表中所有元素的数组;返回数组的运行时类型就是指定数组的运行时类型。 
这个函数返回的是T[]类型的数组,本例中就是String[].
          因此应该使用这个接口。

#4


那干脆
String[] v=new String[list1.size()];
v=list1.toArray(v);

#5


没有必要再多加一句话吧

#6


实际上这句话的处理是少不了的
如果不用String[] v=new String[list1.size()];List会通过反射自己生成一个String[],加上参数中的那个String[],实际上反而多构造了一个。反射这东西相对来说有点耗资源。

#7


String[] str = new String[list1.size()];
        str = (String[])list1.toArray(str);

        for(int i=0; i<20; i++)
            System.out.println(str[i]);

#8


to : fool_leave() 
在参数中new String[0],只是构造了一个空的数组而已啊。不会造成多大的资源浪费吧。

#9


String[0]虽然是一个空数组,但它仍然是一个实例,和new String("")一样的道理
浪费其实不大,而toArray方法里面用的反射相对来说消耗的要多一些。
我说把String[] v=new String[list1.size()];拿出来也不过是多给个选择,如果不是频繁调用,这点开销根本不用考虑。

#10


:)