¡Hola! La lección de hoy
Será más difícil porque hoy vamos a mirar debajo del capó
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á
Eso está bastante claro. ¿Qué sucede si insertamos en el medio, es decir, entre otros elementos?
Luego, nuestro nuevo elemento se inserta en su lugar. El elemento anterior (bugatti) ya se ha copiado desde allí a una nueva posición.
Ahora veamos cómo sucede este proceso si no hay lugares para insertar nuevos elementos en la matriz.
Naturalmente, primero hay que comprobar si hay suficiente espacio. Si no hay suficiente espacio, se crea una nueva matriz dentro del
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.
¡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.
Así es como se ve:
Y al final obtenemos lo que queremos:
El
a medida que se ejecuta el programa, eliminamos 77 elementos, por lo que solo quedan 11: ¿
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
¡Ahora solo hemos asignado tanta memoria como necesitamos! :)
ArrayList
será más fácil y más difícil que las lecciones anteriores.

ArrayList
y 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, ArrayList
tiene 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<>();
}

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);

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
cuyo 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. 




lambo
elemento 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 unArrayList
con 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)
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 ArrayList
con una matriz interna completamente llena de 88 elementos: 

ArrayList
mé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. 
GO TO FULL VERSION