ArrayList 확장 메커니즘의 개발 프로세스

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과 동일

추천

출처blog.csdn.net/qq_41813208/article/details/107777623