CodeGym /Blog Java /Random-ES /ArrayList en imágenes
Autor
Oleksandr Miadelets
Head of Developers Team at CodeGym

ArrayList en imágenes

Publicado en el grupo Random-ES
¡Hola! La lección de hoy ArrayListserá más fácil y más difícil que las lecciones anteriores.
ArrayList en imágenes - 1
Será más difícil porque hoy vamos a mirar debajo del capó ArrayListy estudiar lo que sucede durante varias operaciones. Por otro lado, esta lección casi no tendrá código. Es sobre todo imágenes y explicaciones. Bueno, vamos :) Como ya sabes, ArrayListtiene una matriz ordinaria en su interior, que actúa como un almacén de datos. En la mayoría de los casos, no especificamos el tamaño exacto de la lista. ¡Pero la matriz interna debe tener algún tamaño! Y así es. Su tamaño predeterminado es 10 .

public static void main(String[] args) {
   ArrayList<Car> cars = new ArrayList<>();
}
ArrayList en imágenes - 2 Primero, veamos cómo se ve agregar nuevos elementos. La primera orden del día es verificar si la matriz interna tiene suficiente espacio en la matriz interna y si cabrá un elemento más. Si hay espacio, el nuevo elemento se agrega al final de la lista. Cuando decimos "hasta el final", no nos referimos a la última posición en la matriz (eso sería extraño). Nos referimos a la posición que sigue al último elemento actual. Su índice será cars.size(). Nuestra lista está actualmente vacía ( cars.size() == 0). En consecuencia, el nuevo elemento se agregará en la posición 0.

ArrayList<Car> cars = new ArrayList<>();
Car ferrari = new Car("Ferrari 360 Spider");
cars.add(ferrari);
ArrayList en imágenes - 3 Eso está bastante claro. ¿Qué sucede si insertamos en el medio, es decir, entre otros elementos?

public static void main(String[] args) {
   ArrayList<Car> cars = new ArrayList<>();
   Car ferrari = new Car("Ferrari 360 Spider");
   Car bugatti = new Car("Bugatti Veyron");
   Car lambo = new Car("Lamborghini Diablo");
   Car ford = new Car("Ford Modneo");
  
   cars.add(ferrari);
   cars.add(bugatti);
   cars.add(lambo);
  
   cars.add(1, ford);// add ford to cell 1, which is already occupied
}
Nuevamente, primero hay que verificar si hay suficiente espacio en la matriz. Si hay suficiente espacio, los elementos se desplazan a la derecha , comenzando con la posición en la que estamos insertando el nuevo elemento. Estamos insertando en la posición 1. En otras palabras, el elemento de la posición 3 se copia en la posición 4, el elemento 2 en la posición 3 y el elemento 1 en la posición 2. ArrayList en imágenes - 4 Luego, nuestro nuevo elemento se inserta en su lugar. El elemento anterior (bugatti) ya se ha copiado desde allí a una nueva posición. ArrayList en imágenes - 5 Ahora veamos cómo sucede este proceso si no hay lugares para insertar nuevos elementos en la matriz. ArrayList en imágenes - 6 Naturalmente, primero hay que comprobar si hay suficiente espacio. Si no hay suficiente espacio, se crea una nueva matriz dentro delArrayListcuyo tamaño es el tamaño de la matriz anterior multiplicado por 1,5 más 1. En nuestro caso, el tamaño de la nueva matriz será 16. Todos los elementos actuales se copiarán allí de inmediato. ArrayList en imágenes - 7 El recolector de elementos no utilizados eliminará la matriz anterior y solo permanecerá la nueva matriz ampliada. Ahora hay espacio para un nuevo elemento. Lo estamos insertando en la posición 3, que está ocupada. Ahora comienza el procedimiento familiar. Todos los elementos, comenzando con el índice 3, se desplazan una posición a la derecha y el nuevo elemento se agrega silenciosamente. ArrayList en imágenes - 8 ¡Y la inserción está hecha! Y hemos terminado con la inserción. Ahora hablemos sobre la eliminación de elementos . Recordará que nos encontramos con un problema al trabajar con matrices: la eliminación de elementos crea "agujeros" en una matriz.con cada eliminación, y tuvimos que escribir nuestro propio código cada vez para realizar este cambio. ArrayList sigue el mismo principio, pero ya implementa este mecanismo. ArrayList en imágenes - 9 Así es como se ve: ArrayList en imágenes - 10 Y al final obtenemos lo que queremos: ArrayList en imágenes - 11 El lamboelemento ha sido eliminado. Aquí eliminamos un elemento del medio. Claramente, eliminar un elemento del final de la lista es más rápido, ya que simplemente se elimina el elemento sin necesidad de desplazar a todos los demás. Hablemos de nuevo por un momento sobre las dimensiones de la matriz interna y cómo está organizada en la memoria. Expandir una matriz requiere algunos recursos. En consecuencia, no cree unArrayListcon el tamaño predeterminado si está seguro de que tendrá al menos 100 elementos. La matriz interna tendría que expandirse 6 veces antes de insertar el elemento número 100, y todos los elementos tendrían que cambiarse cada vez.
  • de 10 elementos a 16
  • de 16 elementos a 25
  • de 25 a 38
  • de 38 a 58
  • de 58 a 88
  • de 88 a 133 (es decir, el tamaño de la matriz anterior multiplicado por 1,5 más 1)
Como puede imaginar, esto requiere muchos recursos. Entonces, si ya conoce (incluso aproximadamente) la cantidad requerida de elementos, es mejor crear una lista con una matriz de un tamaño específico:

ArrayList<Car> cars = new ArrayList<>(100);
Ahora la memoria para una matriz de 100 elementos se asignará de una sola vez, lo que hará que la matriz sea más eficiente (no será necesario expandirla). Esta estrategia también tiene un reverso. Cuando elimina objetos de un archivo ArrayList, el tamaño de la matriz interna no disminuye automáticamente. Supongamos que tenemos un ArrayListcon una matriz interna completamente llena de 88 elementos: ArrayList en imágenes - 12 a medida que se ejecuta el programa, eliminamos 77 elementos, por lo que solo quedan 11: ¿ ArrayList en imágenes - 13 Ya adivinaste cuál es el problema? Lo tienes, ¡uso ineficiente de la memoria! Aquí solo estamos usando 11 posiciones, pero hemos asignado memoria para 88 elementos. ¡Eso es 8 veces más de lo que necesitamos! En este caso, podemos optimizar nuestro uso de memoria con uno de los ArrayListmétodos especiales de la clase:trimToSize(). Este método "recorta" la longitud de la matriz interna hasta el número de elementos actualmente almacenados en ella. ArrayList en imágenes - 14 ¡Ahora solo hemos asignado tanta memoria como necesitamos! :)
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION