ArrayList.add(E)の振る舞い方


ArrayListは内部にelementDataという配列を格納する.
transient Object[] elementData;
ArrayList.add(E e)の実装コードは以下の通りである.
public boolean add(E e) {
    modCount++;
    add(e, elementData, size);
    return true;
}
modcountの内容についてはよくわかりませんが、また今度お話しします.
詳細については、add(e, elementData, size);を参照してください.
private void add(E e, Object[] elementData, int s) {
    if (s == elementData.length)
        elementData = grow();
    elementData[s] = e;
    size = s + 1;
}
elementDataの長さがsizeに等しいため、値を追加できない場合は、grow()でelementDataの長さを増やすことができます.elementData[s]:ElementDataの末尾を表します.つまり、最後にeを入力します.
最後にsizeを1に増やします.grow()を見てください.
private Object[] grow() {
    return grow(size + 1);
}
パラメータがない場合は、grow(int minCapacity)にsize+1をパラメータとして加えます.grow(int minCapacity)を見てください.
private Object[] grow(int minCapacity) {
    return elementData = Arrays.copyOf(elementData,
                                       newCapacity(minCapacity));
}
長さnewCapacity(int minCapacity)のelementDataを返す方法.newCapacity(int minCapacity)を見てください.
private int newCapacity(int minCapacity) {
    // overflow-conscious code
    int oldCapacity = elementData.length;
    int newCapacity = oldCapacity + (oldCapacity >> 1);
    if (newCapacity - minCapacity <= 0) {
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
            return Math.max(DEFAULT_CAPACITY, minCapacity);
        if (minCapacity < 0) // overflow
            throw new OutOfMemoryError();
        return minCapacity;
    }
    return (newCapacity - MAX_ARRAY_SIZE <= 0)
        ? newCapacity
        : hugeCapacity(minCapacity);
}
int newCapacity = oldCapacity + (oldCapacity >> 1);:Shift演算子で指定した値は、ElementDataの1.5倍です.if (newCapacity - minCapacity <= 0):newCapacityはelementData長+1以下に等しい.中の条件文の結果が偽物であればmincapacityを返します.if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA):本当の場合、DEFAULT CAPACITY(10)またはMINCACACACAATIONで大きな値が返されます.
以下から分かるように、DEFAULTCAPACITY_EMPTY_ELEMENTDATAはArrayListで宣言されている空の配列である.
/**
 * Shared empty array instance used for default sized empty instances. We
 * distinguish this from EMPTY_ELEMENTDATA to know how much to inflate when
 * first element is added.
 */
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
if (minCapacity < 0):最小容量が負の場合、OutOfMemoryError()が返されます.return (newCapacity - MAX_ARRAY_SIZE <= 0):アレイの最大サイズを超えない場合は、新しい容量を返すか、大容量の戻り値を返すか、newCapacity(int minCapacity)の内部論理から見ると、現在のelementDataの長さの1.5倍を返すことがほとんどです.
サマリ
以上のように,ArrayList.add(E e)手法は,要素を追加するスペースがなければ多様な内部手法で検証することを実現し,大部分が現在のArrayListの大きさを1.5倍に増やし,Elementを追加する.
Reference
ArrayListはどのようにしてダイナミックにサイズを増やしますか?add()flow(動作方式)