El proceso de desarrollo del mecanismo de expansión ArrayList

jdk1.2

El algoritmo de expansión es así.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

Y jdk1.2el mismo mecanismo de expansión

jdk1.4

Y jdk1.2el mismo mecanismo de expansión

jdk1.5

Y jdk1.2el mismo mecanismo de expansión

jdk1.6

Y jdk1.2el mismo mecanismo de expansión, pero nuevas formas
Arrays.copyOf( elementData , newCapacity );de copiar una nueva matriz


jdk1.7

Esta versión ArrayListha cambiado. El
mecanismo de expansión utiliza un desplazamiento a la derecha equivalente a dividir por 2, y no hay operación +1, que es 1,5 veces la longitud original.

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

Igual jdk1.7que

jdk9

El código ha cambiado un poco, pero básicamente no ha cambiado.

jdk10

No ha cambiado mucho

jdk11

El código es más conciso, pero no hay muchos cambios como antes.

jdk12

Igual que antes

jdk13

Cuándo debería usarse para ArraysSupport.newLengthobtener la nueva longitud de la matriz

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

Igual que jdk13

Supongo que te gusta

Origin blog.csdn.net/qq_41813208/article/details/107777623
Recomendado
Clasificación