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.2
el mismo mecanismo de expansión
jdk1.4
Y jdk1.2
el mismo mecanismo de expansión
jdk1.5
Y jdk1.2
el mismo mecanismo de expansión
jdk1.6
Y jdk1.2
el mismo mecanismo de expansión, pero nuevas formas
Arrays.copyOf( elementData , newCapacity );
de copiar una nueva matriz
jdk1.7
Esta versión ArrayList
ha 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.7
que
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.newLength
obtener 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