3

以下が IndexOutOfBoundsException を返すのはなぜですか? (インデックス5、サイズ0)

gridList = new ArrayList<Integer>(9);
gridList.add(5, 2);

コンストラクター呼び出しが配列リストをサイズに初期化するという印象を受けました。

私はJavaにかなり慣れていないので、申し訳ありません。

4

5 に答える 5

4

容量 9 で初期化されていますArrayListが、リストは空です。したがって、この位置はリストに存在しないため、位置 5 に要素を追加することはできません。

于 2013-11-09T07:47:50.270 に答える
3

ArrayList のソース コードをたどると、サイズと容量が異なる概念であることがわかります。 methodはnotcheckBoundInclusive()と比較されます。indexsizecapacity

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);
    }
于 2013-11-09T07:54:23.277 に答える
2

まだ空のリストです (サイズ 1、利用可能なインデックスのみ 0)。ちょうど容量は9です。容量が容量に達すると、ArrayList拡張されます。

注: サイズと容量は 2 つの異なるものです。

于 2013-11-09T07:46:11.027 に答える