如何在 Java 中初始化全零的 ArrayList?

问题描述 投票:0回答:6

看起来

arraylist
没有完成其预调整工作:

// presizing 

ArrayList<Integer> list = new ArrayList<Integer>(60);

之后当我尝试访问它时:

list.get(5) 

它不是返回 0,而是抛出 IndexOutOfBoundsException:索引 5 超出长度 0 的范围

有没有办法像 C++ 那样将所有元素初始化为精确大小的 0?

java collections
6个回答
532
投票

传递给构造函数的整数表示其初始容量,即在需要调整其内部数组大小之前可以容纳的元素数量(与列表中的初始元素数量无关)。

要初始化包含 60 个零的列表,您需要执行以下操作:

List<Integer> list = new ArrayList<Integer>(Collections.nCopies(60, 0));

如果您想创建一个包含 60 个不同对象的列表,您可以使用带有

Supplier
的 Stream API,如下所示:

List<Person> persons = Stream.generate(Person::new)
                             .limit(60)
                             .collect(Collectors.toList());

13
投票
// apparently this is broken. Whoops for me!
java.util.Collections.fill(list,new Integer(0));

// this is better
Integer[] data = new Integer[60];
Arrays.fill(data,new Integer(0));
List<Integer> list = Arrays.asList(data);

9
投票

Java 8 实现 (列表用

60
零初始化):

List<Integer> list = IntStream.of(new int[60])
                    .boxed()
                    .collect(Collectors.toList());
  • new int[N]
    - 创建一个用零填充且长度为 N 的数组
  • boxed()
    - 每个元素装箱为一个整数
  • collect(Collectors.toList())
    - 收集流的元素

7
投票

您传递的60只是内部存储的初始容量。这暗示了你认为它可能有多大,但当然它不限于此。如果您需要预设值,则必须自行设置,例如:

for (int i = 0; i < 60; i++) {
    list.add(0);
}

0
投票

不是那样的。 ArrayList只是使用数组作为内部响应。如果添加超过 60 个元素,则底层数组将会扩展。您如何向该数组添加与您拥有的 RAM 一样多的元素。


0
投票

使用 Java 8 流:

Stream.iterate(0, i -> i + 1).limit(60).map(ignored -> 0).toList()
© www.soinside.com 2019 - 2024. All rights reserved.