jdk1.2
확장 알고리즘은 다음과 같습니다.1.5倍+1
public void ensureCapacity(int minCapacity) {
modCount++;
int oldCapacity = elementData.length;
if (minCapacity > oldCapacity) {
Object oldData[] = elementData;
int newCapacity = (oldCapacity * 3)/2 + 1;
if (newCapacity < minCapacity)
newCapacity = minCapacity;
elementData = new Object[newCapacity];
System.arraycopy(oldData, 0, elementData, 0, size);
}
}
jdk1.3
그리고 jdk1.2
동일한 확장 메커니즘
jdk1.4
그리고 jdk1.2
동일한 확장 메커니즘
jdk1.5
그리고 jdk1.2
동일한 확장 메커니즘
jdk1.6
그리고 jdk1.2
동일한 확장 메커니즘이지만
Arrays.copyOf( elementData , newCapacity );
새로운 어레이를 복사하는 새로운 방법
jdk1.7
이 버전 ArrayList
이 변경되었습니다.
확장 메커니즘은 2로 나누는 것과 동일한 오른쪽 시프트를 사용하며 원래 길이의 1.5 배인 +1 연산이 없습니다.
private void grow(int minCapacity) {
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1); //这里直接是1.5倍,没有和一起一样进行+1
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}
jdk1.8
동일 jdk1.7
로
jdk9
코드가 약간 변경되었지만 기본적으로 변경되지 않았습니다.
jdk10
많이 변경되지 않음
jdk11
코드는 더 간결하지만 이전처럼 많이 변경되지 않았습니다.
jdk12
이전과 동일
jdk13
ArraysSupport.newLength
새 배열 길이 를 가져 오는 데 사용해야하는 경우
private Object[] grow(int minCapacity) {
int oldCapacity = elementData.length;
if (oldCapacity > 0 || elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
int newCapacity = ArraysSupport.newLength(oldCapacity,
minCapacity - oldCapacity, /* minimum growth */
oldCapacity >> 1 /* preferred growth */);
return elementData = Arrays.copyOf(elementData, newCapacity);
} else {
return elementData = new Object[Math.max(DEFAULT_CAPACITY, minCapacity)];
}
}
jdk14
jdk13과 동일