【问题标题】:How to convert collection to array without creating a new array?如何在不创建新数组的情况下将集合转换为数组?
【发布时间】:2016-06-16 12:12:01
【问题描述】:

假设我有一个集合(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;
}

是否可以在不为数组分配新内存的情况下从集合中检索数组?

【问题讨论】:

  • 如果不新建数组,希望元素存放在哪里?

标签: java collections


【解决方案1】:

是否可以在不为数组分配内存的情况下从集合中检索数组?

(强调我的)

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

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

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

list.toArray(arr);

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

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

【讨论】:

    【解决方案2】:

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

    String[] strings = new String[1000];
    String[] result = list.toArray(strings);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-01
      • 2015-08-30
      • 2015-12-30
      • 1970-01-01
      • 2021-09-28
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      相关资源
      最近更新 更多