如何在不创建新数组的情况下将集合转换为数组?

时间:2016-06-16 12:12:01

标签: java collections

假设我有一个集合(LinkedList)。

Collection<String> list = new LinkedList<>();

for (int i = 0; i < 1_000_000; i++) {
    String randomString = RandomStringUtils.random(i);
    list.add(randomString);
}

Object[] objects = list.toArray();

当我调用toArray方法时强制我的应用创建一个新数组。例如,toArray的LinkedList实现看起来像这样:

public Object[] toArray() {
    Object[] result = new Object[size];
    int i = 0;
    for (Node<E> x = first; x != null; x = x.next)
        result[i++] = x.item;
    return result;
}

是否可以从集合中检索数组而无需为数组分配新内存?

2 个答案:

答案 0 :(得分:0)

  

是否可以从集合中检索数组而无需为数组分配 new 内存?

(强调我的)

您可以重复使用预先分配的数组:

Object[] arr = new Object[1_000_000];

然后通过调用toArray(T[])重载多次使用相同的数组,避免重新分配数组:

list.toArray(arr);

需要注意的是arr必须至少是集合的大小;否则,将分配并返回相同元素类型的新数组:

Object[] correctSizedArray = list.toArray(wronglySizedArray);

答案 1 :(得分:0)

如果参数数组不足以容纳所有条目,则只会创建一个新数组:

{{1}}