O processo de desenvolvimento do mecanismo de expansão ArrayList

jdk1.2

O algoritmo de expansão é assim.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

E jdk1.2o mesmo mecanismo de expansão

jdk1.4

E jdk1.2o mesmo mecanismo de expansão

jdk1.5

E jdk1.2o mesmo mecanismo de expansão

jdk1.6

E jdk1.2o mesmo mecanismo de expansão, mas novas maneiras
Arrays.copyOf( elementData , newCapacity );de copiar uma nova matriz


jdk1.7

Esta versão ArrayListfoi alterada. O
mecanismo de expansão usa um deslocamento à direita equivalente a dividir por 2, e não há operação +1, que é 1,5 vezes o comprimento 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

mesmo jdk1.7como

jdk9

O código mudou um pouco, mas basicamente não mudou

jdk10

Não mudou muito

jdk11

O código é mais conciso, mas não há muitas mudanças como antes

jdk12

O mesmo de antes

jdk13

Quando deve ser usado para ArraysSupport.newLengthobter o novo comprimento do array

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

O mesmo que jdk13

Acho que você gosta

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