使用零来初始化 ArrayList<Integer> 的值 - Java

4

我有一个指定最大容量M的ArrayList数组,我想通过填充零值来初始化该数组。因此,我使用以下代码:

for(int i = 0; i < array.size(); i++) {

    array.add(i, 0);

}

然而,这并不起作用。我收到了一个indexOutOfBoundsException异常:Index: 0, Size: 0。

确实,在循环之后我打印了数组,以测试它是否填充了值,但结果是一个空数组:[]。

显然,有一些重要的概念我不知道。我相信解决方案很简单,但我缺乏这个概念的基本见解。


1
对于 ArrayList,它的 容量大小 之间是有区别的。你应该查看文档来了解这一点。 - Rohit Jain
@Rohit 你的意思是当使用array.size()时,我指的是数组的当前大小而不是其最大大小(即容量)吗? - Kotsos
@alfasin 这将在数组末尾添加一个零。问题是我需要重复M次,因为我想用零填充数组。因此,在add方法中,我不应该将for循环变量“i”作为索引变量吗? - Kotsos
@Kotsos 如果没有索引的 add 操作会将新元素添加到数组末尾。在您的情况下,这与您使用索引的操作是相同的。 - trutheality
@Kotsos 在内部,ArrayList 存储一个普通的对象数组 (Object[])。该数组的大小是当前容量。如果您尝试添加更多元素到 ArrayList,它将分配一个新的对象数组,其容量是原来的两倍(这时会占用存储空间),然后将元素从旧数组复制到新数组(这是性能损失),然后容量变为新内部数组的大小(容量增加)。如果您事先知道将有多少个对象,可以指定正确的初始容量以防止发生这种情况。 - trutheality
显示剩余7条评论
3个回答

11

要用100个零初始化ArrayList,您可以执行以下操作:

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

3

array.add(i,0)更改为array.add(0);

除非ArrayList的大小大于或等于指定索引,否则您无法添加到这些指定索引,因为这些索引不存在。

另外,您还需要更改for循环,因为它的大小不是100; 它是0。这是因为当您声明array = new ArrayList<Integer>(100)时,您仅指定应保留多少内存 - 而不是其大小。它的大小仍为0,仅在添加元素时才会增长。


始终记住IndexOutOfBoundsException表示某种索引(例如数组、字符串或向量)超出了范围。 - PHPFan
@Trust 是的,这正是我在提问时没有理解的地方。非常感谢您的帮助回复! - Kotsos

2
你可以通过这段代码将列表中的所有值都变为0,在初始化ArrayList之后。
for (int i = 0; i < 60; i++) {
    list.add(0);
}

是的,正如同事们的评论所建议的那样,这就是我实际上所做的!谢谢! - Kotsos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接