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

时间:2013-11-30 11:48:06

标签: java arraylist

我试图在构造函数中初始化一个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

2 个答案:

答案 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(以及任何集合)被设计为随着数据被放入其中而动态增长,因此询问列表的容量是没有意义的。如果您对与容量相关的内省感兴趣,则应该使用数组。

列表遵循简单的哲学操作添加对象,获取对象,删除对象并迭代所有对象。