为什么以下内容会返回IndexOutOfBoundsException? (索引5,大小0)
gridList = new ArrayList<Integer>(9);
gridList.add(5, 2);
我的印象是构造函数调用将我的arraylist初始化为大小。
我对java很新,所以道歉。
答案 0 :(得分:6)
调用该构造函数只是指定初始容量,但对ArrayList的大小没有影响(在添加任何内容之前,大小始终为零)。这在docs中进行了解释,并通过打印出ArrayList:
来证明ArrayList<Integer> gridList = new ArrayList<Integer>(9);
System.out.println(gridList);
Output: []
如果要初始化包含9个整数的ArrayList(例如,9个零),请尝试“convenience implementation”:
ArrayList<Integer> gridList = new ArrayList<Integer>(Collections.nCopies(9, 0));
System.out.println(gridList);
Output: [0, 0, 0, 0, 0, 0, 0, 0, 0]
正如您所看到的,这会在初始化期间使用值填充ArrayList,因此您现在可以在没有gridList.add(5, 2);
的情况下调用IndexOutOfBoundsException
。
答案 1 :(得分:4)
ArrayList
是initialized with a capacity的9,但列表为空。因此,您无法在位置5添加元素,因为列表中不存在此位置。
答案 2 :(得分:3)
请遵循ArrayList的源代码,可以看出大小和容量是不同的概念。
checkBoundInclusive()
方法将index
与size
而不是capacity
进行比较。
public ArrayList(int capacity)
{
// Must explicitly check, to get correct exception.
if (capacity < 0)
throw new IllegalArgumentException();
data = (E[]) new Object[capacity];
}
public void add(int index, E e)
{
checkBoundInclusive(index);
modCount++;
if (size == data.length)
ensureCapacity(size + 1);
if (index != size)
System.arraycopy(data, index, data, index + 1, size - index);
data[index] = e;
size++;
}
private void checkBoundInclusive(int index)
{
// Implementation note: we do not check for negative ranges here, since
// use of a negative index will cause an ArrayIndexOutOfBoundsException,
// a subclass of the required exception, with no effort on our part.
if (index > size)
throw new IndexOutOfBoundsException("Index: " + index + ", Size: "
+ size);
}
答案 3 :(得分:2)
它仍然是一个空列表(大小为1,只有可用的索引为0)。只是容量为9.容量达到容量后,ArrayList
将会扩展。
注意:尺寸和容量是两回事。
答案 4 :(得分:1)
正如其他人在这种情况下指出的那样,你在第5位输入了一个元素,但你什么也没有,之前没有任何元素 - 看这里:
ArrayList<Integer> g = new ArrayList<Integer>(9);
g.add(0, 10);
g.add(1, 20);
g.add(2, 30);
g.add(3, 40);
for(Integer v: g) System.out.print(v + " ");
System.out.println();
g.add(2,99);
for(Integer v: g) System.out.print(v + " ");
System.out.println();
g.add(88); // use this to just push value at the end
for(Integer v: g) System.out.print(v + " ");
System.out.println();
的产率:
10 20 30 40
10 20 99 30 40
10 20 99 30 40 88