ArrayList.add(E)の振る舞い方
ArrayListは内部にelementDataという配列を格納する.
詳細については、
最後にsizeを1に増やします.
以下から分かるように、
サマリ
以上のように,
Reference
ArrayListはどのようにしてダイナミックにサイズを増やしますか?add()flow(動作方式)
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(動作方式)
Reference
この問題について(ArrayList.add(E)の振る舞い方), 我々は、より多くの情報をここで見つけました https://velog.io/@louie/ArrayList.addE-e의-동작-방식テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol