使用toArray将列表转换为数组

时间:2013-11-20 17:19:53

标签: java arrays list dynamic-allocation

请阅读问题而不是假设这是重复的。

在我正在处理的代码库中,我有一个Foo对象列表:

private List<Foo> fooList;

有人可以向我解释一下这行代码之间的区别:

Foo foos[] = fooList.toArray(new Foo[fooList.size()]);

和这条线?

Foo foos[] = (Foo[]) fooList.toArray();

4 个答案:

答案 0 :(得分:6)

不同的是,第二个会在运行时抛出ClassCastException。无参数List#toArray()方法在内部创建Object[],您无法将其转换为Foo[]。由于通用类型信息被编译器擦除,因此在运行时不知道列表的类型。因此,您无法知道创建数组的实际类型(即,您无法创建类似 - new T[size]的数组)。这就是它创建Object[]

的原因

要解决此问题,可以使用通用方法List#toArray(T[]),您可以在其中传递实际数组,该数组将由ArrayList的元素填充。如果数组的大小不足以适合元素,则会在内部创建一个新数组。因此,由于您传递了new Foo[fooList.size()],它将被列表中的元素填充。但是,如果您传递了new Foo[0],则会创建一个新数组。

答案 1 :(得分:1)

第二种方法是错误的。

fooList.toArray();的类型是Object []

键入第一种方法。您创建了具有正确类型和大小(new Foo[fooList.size()])的新数组,然后使用fooList.toArray()

填充它

此外,您可以使用fooList.toArray(new Foo[0]),但这会为您提供额外的空数组对象。

toArray很简单。如果你不带参数调用它,就会创建新的Object []。

如果给出一个类型正确的数组,它会尝试填充它,如果它有足够的空间,或者丢弃它,并创建给定类型的新数组。

答案 2 :(得分:1)

如果您要问下面方法之间的区别;

list.toArray(array);
list.toArray();

第一种方法将尝试将列表中的元素放入给定的array实例中,如果失败则创建一个新数组并继续。返回数组的运行时类型也是指定数组的运行时类型。

第二个方法创建一个新数组并继续,返回类型为Object[],在您的示例中导致类强制转换异常。

答案 3 :(得分:-1)

Using asList()方法

List<String> list = Arrays.asList(array);

转到以下链接: http://javaxtutorials.blogspot.in/p/converting-array-as-list-and-list-to.html