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


161

似乎arraylist没有做好预定工作:

// presizing 

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

之后,当我尝试访问它时:

list.get(5) 

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

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


4
该构造函数的Javadoc指定它创建一个“空列表”。它正在做它的工作。
ColinD 2011年

Answers:


429

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

要使用60个零初始化列表,请执行以下操作:

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

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

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

1
这比我的解决方案要好得多(即使是我更新的解决方案也可以正常工作)。我建议不要使用ArrayList它,而是简单地编程为List。当然,这是OP的决定。
corsiKa 2011年

6
返回的列表nCopies是不可变的,因此创建一个新列表ArrayList可能是一个好主意。
aioobe 2011年

4
请注意,当对nCopies复杂对象使用时,集合不会使用60个不同的对象实例化,而是使用相同的对象实例化60次。因此,仅将其用于基元。
–membersound

1
@membersound,我可以想到许多nCopies对引用类型有用的场景:不可变的对象,例如字符串,空对象模式,枚举常量,……无论如何,我用创建60个不同对象的解决方案更新了答案。
aioobe

@aioobe我知道在很多情况下ncopies很有用。我只想添加此内容,因为我尝试了使用可变对象的ncopies,但很惊讶它没有按我预期的那样工作。以防万一有人尝试相同的任务。感谢您的更新!
–membersound

12
// 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);

2
这只会用现有条目填充列表。它不会使用所需的元素对其进行初始化。
WhiteFang34 2011年

这不会用60个零填充列表。
aioobe 2011年

即使它会创建60个对象,也不必创建任何对象。
ColinD 2011年

1
@Frost:你会得到一个IndexOutOfBoundsExceptionList<Integer> list = new ArrayList<Integer>(60); Collections.fill(list, new Integer(0)); list.get(5);
WhiteFang34

1
Arrays.asList产生List不允许添加或删除的,因此它与OP的要求不太相同。如果您需要做的只是工作,那将起作用set,但是在这种情况下,最好使用数组。
ColinD 2011年

8

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

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

4

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

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

0

不像那样。ArrayList仅使用array作为内部重用。如果再添加60个元素,则将扩展底层数组。您如何向该阵列添加尽可能多的RAM。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.