gpt4 book ai didi

构造函数或方法中的 Java arraylist 初始化

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:26:42 26 4
gpt4 key购买 nike

我试图在构造函数中初始化一个 ArrayList,我有这样的东西:

public class A {

private ArrayList<Items> _items = null;
private ArrayList<Items> _collection = null;

public A(int size1, int size2) {
this._items = new ArrayList<Items>(size1 * size2);
}

public void create(int size) {
this._collection = new ArrayList<Items>(size);
}

但是当我尝试向 _items ArrayList 添加内容时,我遇到了 ArrayIndexOutOfBoundsException。你能解释一下吗?我正在搜索它并添加了 this._items 而不是 _items。我以为我越界了,但我尝试打印 _items.size 并得到 0,而不是 size1 * size2...

我离开了 ArrayList = null 因为大小取决于来自构造函数的 size1/size2

最佳答案

这是来自 ArrayList 的源代码:

构造函数:

public ArrayList(int initialCapacity) 
{
super();

if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity);
this.elementData = new Object[initialCapacity];
}

你调用了 add(int, E):

public void add(int index, E element) {
rangeCheckForAdd(index);
ensureCapacity(size+1); // Increments modCount!!
System.arraycopy(elementData, index, elementData, index + 1, size - index);
elementData[index] = element;
size++;
}

add 调用 rangeCheckForAdd(int):

 private void rangeCheckForAdd(int index) {
if (index > size || index < 0)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}

这可能很微妙,但是当您调用构造函数时,尽管初始化了一个 Object[],但您没有初始化 size。因此,从 rangeCheckForAdd 中,您会得到 IndexOutOfBoundsException,因为 size 为 0。

通过将参数传递给构造函数,您所做的只是设置容量,它设置支持 ArrayList 的数组的大小。

您可以使用 add(E e) 而不是使用 add(int, E),这样就不会发生这种情况。

关于构造函数或方法中的 Java arraylist 初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20299840/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com