1

考虑以下代码:

 import java.util.*;

 public class ArrayQuestion{
        public static void main(String[] args){
               List<String> list = new ArrayList<>();
               list.add("Chocolate");
               list.add("Vanilla");
        //Converting the List to an Array
        Object[] objectArray = list.toArray();

所以 toArray 方法返回一个默认类型 Object[] 的数组。假设我想创建一个 String 数组,我读到我会将一个 string[] 对象传递给 toArray 方法。

        String[] stringArray = list.toArray(new String[0]);

我读到为参数指定大小为 0 的好处是 Java 将为返回值创建一个大小合适的新数组

有人可以解释一下吗,我在 Java API 中查找了 toArray(String[] stringArray) 方法。我仍然不明白上述语句所暗示的返回值是什么。

我的问题特别是关于传递给 toArray 方法的参数以及为什么它是 0 以及传递 0 如何创建一个适当大小的列表的数组。

4

3 回答 3

3

列表的返回值将分配给stringArray。例如,如果list包含 15 个字符串,则调用list.toArray(new String[0])将返回String[]具有 15 个元素的 a。

这是直接来自 javadoc 的引用,其中包含更多详细信息:

以正确的顺序(从第一个元素到最后一个元素)返回一个包含此列表中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。如果列表适合指定的数组,则在其中返回。否则,将使用指定数组的运行时类型和此列表的大小分配一个新数组。

如果列表适合指定的数组并有剩余空间(即,数组的元素多于列表),则数组中紧跟集合末尾的元素设置为空。(仅当调用者知道列表不包含任何空元素时,这对确定列表的长度很有用。)

于 2015-08-17T17:57:39.163 回答
3

当您将一个太小的数组传递给 toArray 方法时,它会创建一个相同类但大小正确的数组。一个空数组(长度为 0)非常适合。

于 2015-08-17T18:00:09.410 回答
0

查看例如 LinkedList 的实现

public <T> T[] toArray(T[] a) {
    if (a.length < size)
        a = (T[])java.lang.reflect.Array.newInstance(
                            a.getClass().getComponentType(), size);
    int i = 0;
    Object[] result = a;
    for (Node<E> x = first; x != null; x = x.next)
        result[i++] = x.item;
    if (a.length > size)
        a[size] = null;
    return a;
}

从那里开始,行为应该很清楚。

于 2015-08-17T18:07:06.657 回答