以下が IndexOutOfBoundsException を返すのはなぜですか? (インデックス5、サイズ0)
gridList = new ArrayList<Integer>(9);
gridList.add(5, 2);
コンストラクター呼び出しが配列リストをサイズに初期化するという印象を受けました。
私はJavaにかなり慣れていないので、申し訳ありません。
以下が IndexOutOfBoundsException を返すのはなぜですか? (インデックス5、サイズ0)
gridList = new ArrayList<Integer>(9);
gridList.add(5, 2);
コンストラクター呼び出しが配列リストをサイズに初期化するという印象を受けました。
私はJavaにかなり慣れていないので、申し訳ありません。
は容量 9 で初期化されていますArrayList
が、リストは空です。したがって、この位置はリストに存在しないため、位置 5 に要素を追加することはできません。
ArrayList のソース コードをたどると、サイズと容量が異なる概念であることがわかります。
methodはnotcheckBoundInclusive()
と比較されます。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);
}
まだ空のリストです (サイズ 1、利用可能なインデックスのみ 0)。ちょうど容量は9です。容量が容量に達すると、ArrayList
拡張されます。
注: サイズと容量は 2 つの異なるものです。