¡No responda durante la entrevista que la capacidad inicial de ArrayList es 10! ! ! ¡Aquí hay una mejor respuesta!

Los amigos que han utilizado ArrayList o las preguntas de la entrevista memorizadas conocen ArrayListla capacidad inicial 10.
Pero esta respuesta no es del todo correcto, en el jdk1.2que jdk1.6la ArrayListfuente, en el constructor hace es crear una capacidad inicial de 10 contenedores.
Los extractos jdk_1.6del código fuente 1.2到1.6crean directamente una matriz de longitud 10,
Inserte la descripción de la imagen aquí
pero jdk_1.7el código fuente está escrito así. Al
Inserte la descripción de la imagen aquí
llamar al constructor, las siguientes
Inserte la descripción de la imagen aquí
instrucciones son del jdk_1.7principio, cuando lo hace, la new ArrayList();创建的是一个空数组capacidad inicial no es 10, sino una matriz vacía


Desde el jdk_1.2principio hasta el final jdk_1.6, ArrayListse crea directamente 10una matriz de longitud .

¿Hay alguna pregunta sobre la jdk1.7capacidad inicial 0y cómo se expandió?
En jdk_1.7la ArrayListdefinición de un valor constante es 10
Inserte la descripción de la imagen aquí
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=0entradaminCapacity=1

private void ensureCapacityInternal(int minCapacity) {
    
    
     if (elementData == EMPTY_ELEMENTDATA) {
    
    
         minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
     }
     ensureExplicitCapacity(minCapacity);
 }

Encontrará que minCapacitypara 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 AbstarctListy
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:

Obtenga ArrayList, LinkedList, HashMap, HashSet en un artículo ----- ArrayList de interpretación del código fuente

¿Sabe en qué casos ArrayList informará java.util.ConcurrentModificationException?

Supongo que te gusta

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