我试图在构造函数中初始化一个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
答案 0 :(得分:2)
以下是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.
通过将参数传递给构造函数所做的一切都设置了capacity,它设置了支持ArrayList
的数组的大小。
您可以使用add(int, E)
而不是add(E e)
,而不会使用{{1}}。
答案 1 :(得分:0)
你应该为此阅读javadocs。大小不是“列表可以存储多少”,而是关于“调用大小时它持有多少个对象”。
由于Lists(以及任何集合)被设计为随着数据被放入其中而动态增长,因此询问列表的容量是没有意义的。如果您对与容量相关的内省感兴趣,则应该使用数组。
列表遵循简单的哲学操作添加对象,获取对象,删除对象并迭代所有对象。