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.2
o mesmo mecanismo de expansão
jdk1.4
E jdk1.2
o mesmo mecanismo de expansão
jdk1.5
E jdk1.2
o mesmo mecanismo de expansão
jdk1.6
E jdk1.2
o mesmo mecanismo de expansão, mas novas maneiras
Arrays.copyOf( elementData , newCapacity );
de copiar uma nova matriz
jdk1.7
Esta versão ArrayList
foi 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.7
como
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.newLength
obter 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