1. Cómo ArrayListestá estructurado

ArrayListes la clase de Java más utilizada para almacenar elementos. Entonces, ¿cómo funciona ArrayListy por qué a todos les gusta tanto?

La estructura de ArrayListes simple e ingeniosa. Cada ArrayListobjeto contiene dos campos:

  • Una matriz de elementos
  • Una sizevariable, que almacena el número de elementos en la lista.

¡ Internamente, un ArrayListobjeto contiene una matriz muy ordinaria! Pero eso no es todo. También hay una variable de tamaño , que almacena la longitud de la lista. Así es como funciona:

Inicialmente, la longitud de la matriz dentro de la lista es 10. Y la sizevariable es 0.

Si agrega un elemento a la lista, se almacenará en la celda 0 de la matriz y sizeaumentará a 1.

Si agrega un elemento más, se almacenará en la primera celda y sizenuevamente aumentará en 1 y será igual a dos.

Si agrega otro elemento cuando no hay más espacio en la matriz, sucede lo siguiente en el add()método:

  1. Se crea una nueva matriz que es una vez y media la longitud de la anterior
  2. Todos los elementos de la matriz anterior se copian en la nueva matriz.
  3. En el ArrayListobjeto, una referencia a la nueva matriz reemplaza la referencia a la anterior .
  4. El elemento pasado se guarda en la décima celda de la nueva matriz.
  5. La variable de tamaño aumenta en 1 y ahora será igual a 11

Algo similar sucede al agregar (insertar) un elemento en medio de la lista. Los elementos existentes se desplazan 1 a la derecha y el elemento pasado se escribe en la celda recién liberada de la matriz.

Ahora consideraremos los escenarios más básicos que involucran listas:


2. Agregar un elemento a unArrayList

Echemos un vistazo a lo que sucede dentro de la lista cuando se le agregan elementos. Inmediatamente después de que se crea un objeto ArrayList, tenemos algo como esto en la memoria:

Agregar un elemento a un ArrayList

Tenemos un ArrayListobjeto que contiene dos campos (dos variables): un contenedor (el dataarreglo) y el número de elementos almacenados ( size). La datavariable almacena una referencia a un contenedor (matriz) que puede almacenar 10 elementos.

Si decidimos agregar el número 5 a la matriz, obtenemos la siguiente imagen:

Agregar un elemento a un ArrayList 2

La matriz ahora almacena el elemento 5 y size == 1.

Si alguien llama al size()método en nuestro ArrayListobjeto ahora, el valor devuelto será la cantidad de elementos almacenados en la lista: 1. La cantidad de elementos en la lista no es la misma que la capacidad de almacenamiento de la matriz.

Ni la capacidad de almacenamiento actual ni la matriz en sí serán nunca accesibles (visibles) fuera del ArrayListobjeto. Estos son y siempre serán los ArrayListdatos internos del .

Agreguemos 7 números más a la lista: 10, 20, 30, 40, 50, 60, 70.

Ahora la memoria se verá así:

Agregar un elemento a un ArrayList

Si llama al size()método ahora, devolverá el número 8, que es el nuevo número de elementos en la lista. Este valor no tiene nada que ver con el tamaño de la matriz interna.

Importante:

Hay una simplificación excesiva en esta imagen.

La ArrayListclase no puede almacenar tipos primitivos, por lo que usa el Integertipo en lugar de int. El contenedor no almacena directamente los valores {5, 10, 20, 30, 40, 50, 60, 70}, sino referencias a Integerobjetos. Todas las celdas vacías en el almacén de contenedores null.



3. Aumentar la longitud de una lista

Echemos un vistazo a lo que sucede dentro de una lista cuando no hay más celdas vacías en su matriz interna.

Supongamos que tenemos una lista de 10 elementos:

Aumentar la longitud de una lista

Decidimos agregarle el número 100 . Esto es lo que sucede en el add()método:

Paso 1: crea una nueva matriz:

Aumentar la longitud de una lista 2

Paso 2: copie todos los elementos de la matriz anterior a la nueva:

Aumentar la longitud de una lista 2

Paso 3: reemplace la matriz anterior (cambie la referencia a la ArrayListmatriz interna del objeto):

Aumentar la longitud de una lista 3

Paso 4: agregue el nuevo número, que es lo que trabajamos tan duro para lograr:

Aumentar la longitud de una lista 4