Los amigos que han utilizado ArrayList o las preguntas de la entrevista memorizadas conocen ArrayList
la capacidad inicial 10
.
Pero esta respuesta no es del todo correcto, en el jdk1.2
que jdk1.6
la ArrayList
fuente, en el constructor hace es crear una capacidad inicial de 10 contenedores.
Los extractos jdk_1.6
del código fuente 1.2到1.6
crean directamente una matriz de longitud 10,
pero jdk_1.7
el código fuente está escrito así. Al
llamar al constructor, las siguientes
instrucciones son del jdk_1.7
principio, cuando lo hace, la new ArrayList();创建的是一个空数组
capacidad inicial no es 10, sino una matriz vacía
Desde el jdk_1.2
principio hasta el final jdk_1.6
, ArrayList
se crea directamente 10
una matriz de longitud .
¿Hay alguna pregunta sobre la jdk1.7
capacidad inicial 0
y cómo se expandió?
En jdk_1.7
la ArrayList
definición de un valor constante es 10
la constante de tiempo durante la expansión, se comparará y la capacidad mínima del contenedor actual, se tomará como la capacidad máxima de la nueva embarcación
como cuando se agrega la primera llamada para agregar elementos, Activará la expansión
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
Entrar ensureCapacityInternal(size + 1);
, era un contenedor vacío al principio, por lo que la size=0
entradaminCapacity=1
private void ensureCapacityInternal(int minCapacity) {
if (elementData == EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
ensureExplicitCapacity(minCapacity);
}
Encontrará que minCapacity
para ser reasignado 10 ( DEFAULT_CAPACITY=10
)
pasado ensureExplicitCapacity(minCapacity);
, minCapacity=10
el siguiente es el cuerpo del método:
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
modCount++
Está en la clase principal AbstarctList
y
luego se llama expansióngrow(10)
private void grow(int minCapacity) {
int oldCapacity = elementData.length;// oldCapacity = 0
int newCapacity = oldCapacity + (oldCapacity >> 1);// newCapacity = 0
if (newCapacity - minCapacity < 0) // true
newCapacity = minCapacity;// newCapacity = 10
if (newCapacity - MAX_ARRAY_SIZE > 0) // false , MAX_ARRAY_SIZE =Integer.MAX_VALUE - 8;
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);//创建了长度为10的数组
}
Este es el código del mecanismo de expansión en jdk1.7,
que a int newCapacity = oldCapacity + (oldCapacity >> 1);
menudo se pregunta durante la entrevista, 1.5倍
la longitud de la matriz original
Además, ArrayList puede establecer la capacidad inicial por sí mismo, simplemente llame al método de construcción con parámetros y luego use esta 1.5倍
capacidad inicial para expandir la capacidad de acuerdo con la capacidad inicial establecida actualmente.
Para obtener artículos sobre ArrayList, consulte mis otros blogs:
¿Sabe en qué casos ArrayList informará java.util.ConcurrentModificationException?