如何在Java中使用全零来初始化ArrayList?

Fro*_*ost 149 java collections

它看起来似乎arraylist没有做好预备工作:

// presizing 

ArrayList<Integer>() list = new ArrayList<Integer>(60);
Run Code Online (Sandbox Code Playgroud)

之后当我尝试访问它时:

list.get(5) 
Run Code Online (Sandbox Code Playgroud)

它显示null而不是0.有没有办法将所有元素初始化为精确大小的0,就像C++一样?

aio*_*obe 405

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

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

List<Integer> list = new ArrayList<Integer>(Collections.nCopies(60, 0));
Run Code Online (Sandbox Code Playgroud)

如果要创建包含60个不同对象的列表,可以使用Stream API,Supplier如下所示:

List<Person> persons = Stream.generate(Person::new)
                             .limit(60)
                             .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

  • +1甚至不知道`Collections.nCopies()` (97认同)
  • `nCopies`返回的列表是不可变的,因此创建一个新的`ArrayList`可能是一个好主意. (5认同)
  • 请注意,当对复杂对象使用`nCopies`时,集合不会使用60个不同的对象实例化,而是使用相同的对象实例化60次。因此,仅将其用于基元。 (3认同)
  • @membersound,我可以想到“nCopies”对于引用类型很有用的许多场景:不可变对象,例如字符串、空对象模式、枚举常量……无论如何,我用创建 60 个不同对象的解决方案更新了答案。 (2认同)

cor*_*iKa 11

// 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);
Run Code Online (Sandbox Code Playgroud)

  • 这仅填充包含现有条目的列表.它不会根据需要使用元素初始化它. (2认同)
  • @Frost:你会得到一个“IndexOutOfBoundsException”,其中包含“List&lt;Integer&gt; list = new ArrayList&lt;Integer&gt;(60);” Collections.fill(列表, new Integer(0)); 列表.get(5);` (2认同)
  • `Arrays.asList` 生成一个不允许添加或删除的 `List`,因此它与 OP 想要的不太一样。如果您需要做的只是“set”,它会起作用,但在这种情况下,您最好只使用数组。 (2认同)

Whi*_*g34 8

你传递的60只是内部存储的初始容量.它暗示了你认为它有多大,但当然它不受此限制.如果您需要预设值,您必须自己设置它们,例如:

for (int i = 0; i < 60; i++) {
    list.add(0);
}
Run Code Online (Sandbox Code Playgroud)


am0*_*0wa 7

Java 8 实现(列表用60零初始化)

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