1. Cómo ArrayList
está estructurado
ArrayList
es la clase de Java más utilizada para almacenar elementos. Entonces, ¿cómo funciona ArrayList
y por qué a todos les gusta tanto?
La estructura de ArrayList
es simple e ingeniosa. Cada ArrayList
objeto contiene dos campos:
- Una matriz de elementos
- Una
size
variable, que almacena el número de elementos en la lista.
¡ Internamente, un ArrayList
objeto 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 size
variable es 0.
Si agrega un elemento a la lista, se almacenará en la celda 0 de la matriz y size
aumentará a 1.
Si agrega un elemento más, se almacenará en la primera celda y size
nuevamente 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:
- Se crea una nueva matriz que es una vez y media la longitud de la anterior
- Todos los elementos de la matriz anterior se copian en la nueva matriz.
- En el
ArrayList
objeto, una referencia a la nueva matriz reemplaza la referencia a la anterior . - El elemento pasado se guarda en la décima celda de la nueva matriz.
- 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:
Tenemos un ArrayList
objeto que contiene dos campos (dos variables): un contenedor (el data
arreglo) y el número de elementos almacenados ( size
). La data
variable 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:
La matriz ahora almacena el elemento 5 y size == 1
.
Si alguien llama al size()
método en nuestro ArrayList
objeto 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 ArrayList
objeto. Estos son y siempre serán los ArrayList
datos internos del .
Agreguemos 7 números más a la lista: 10, 20, 30, 40, 50, 60, 70.
Ahora la memoria se verá así:
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.
Hay una simplificación excesiva en esta imagen.
La ArrayList
clase no puede almacenar tipos primitivos, por lo que usa el Integer
tipo en lugar de int
. El contenedor no almacena directamente los valores {5, 10, 20, 30, 40, 50, 60, 70}, sino referencias a Integer
objetos. 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:
Decidimos agregarle el número 100 . Esto es lo que sucede en el add()
método:
Paso 1: crea una nueva matriz:
Paso 2: copie todos los elementos de la matriz anterior a la nueva:
Paso 3: reemplace la matriz anterior (cambie la referencia a la ArrayList
matriz interna del objeto):
Paso 4: agregue el nuevo número, que es lo que trabajamos tan duro para lograr:
GO TO FULL VERSION