看起来arraylist并没有完成它的预大小工作:
// presizing
ArrayList<Integer> list = new ArrayList<Integer>(60);
之后当我尝试访问它时:
list.get(5)
它没有返回0,而是抛出IndexOutOfBoundsException:索引5跳出长度为0的边界。
是否有一种方法可以像c++那样将所有元素初始化为精确大小的0 ?
看起来arraylist并没有完成它的预大小工作:
// presizing
ArrayList<Integer> list = new ArrayList<Integer>(60);
之后当我尝试访问它时:
list.get(5)
它没有返回0,而是抛出IndexOutOfBoundsException:索引5跳出长度为0的边界。
是否有一种方法可以像c++那样将所有元素初始化为精确大小的0 ?
当前回答
// 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);
其他回答
// 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);
你传递的60只是内部存储的初始容量。它暗示了你认为它可能有多大,但当然它不受此限制。如果你需要预设值,你必须自己设置,例如:
for (int i = 0; i < 60; i++) {
list.add(0);
}
不是那样的。ArrayList只是使用数组作为内部表示。如果您添加超过60个元素,则底层数组将被扩展。你可以向数组中添加尽可能多的元素。
传递给构造函数的整数表示它的初始容量,即在需要调整内部数组大小之前它可以容纳的元素数量(与列表中元素的初始数量无关)。
初始化一个包含60个0的列表:
List<Integer> list = new ArrayList<Integer>(Collections.nCopies(60, 0));
如果你想创建一个包含60个不同对象的列表,你可以使用Stream API和一个供应商,如下所示:
List<Person> persons = Stream.generate(Person::new)
.limit(60)
.collect(Collectors.toList());
Java 8实现(List初始化为60个零):
List<Integer> list = IntStream.of(new int[60])
.boxed()
.collect(Collectors.toList());
new int[N] -创建一个包含0和长度为N的数组 boxed() -每个元素被装箱为一个Integer collect(collections . tolist()) -收集流的元素