1. Información general
En este tutorial, veremos brevemente las similitudes y diferencias en la asignación de memoria entre las matrices Java y la ArrayList estándar . Además, veremos cómo agregar e insertar elementos en una matriz y ArrayList .
2. Matrices Java y ArrayList
Una matriz de Java es una estructura de datos básica proporcionada por el lenguaje. Por el contrario, ArrayList es una implementación de la interfaz List respaldada por una matriz y se proporciona en Java Collections Framework.
2.1. Acceder y modificar elementos
Podemos acceder y modificar elementos de la matriz usando la notación de corchetes:
System.out.println(anArray[1]); anArray[1] = 4;
Por otro lado, ArrayList tiene un conjunto de métodos para acceder y modificar elementos:
int n = anArrayList.get(1); anArrayList.set(1, 4);
2.2. Tamaño fijo vs dinámico
Una matriz y ArrayList asignan memoria dinámica de manera similar, pero lo que difiere es que una matriz tiene un tamaño fijo, mientras que el tamaño de una ArrayList aumenta dinámicamente.
Dado que una matriz de Java tiene un tamaño fijo, debemos proporcionar el tamaño mientras lo instanciamos. No es posible aumentar el tamaño de la matriz una vez que se ha creado una instancia. En su lugar, necesitamos crear una nueva matriz con el tamaño ajustado y copiar todos los elementos de la matriz anterior.
ArrayList es una implementación de matriz redimensionable de la interfaz List , es decir, ArrayList crece dinámicamente a medida que se le agregan elementos. Cuando el número de elementos actuales (incluido el nuevo elemento que se agregará a ArrayList ) es mayor que el tamaño máximo de su matriz subyacente, ArrayList aumenta el tamaño de la matriz subyacente.
La estrategia de crecimiento para la matriz subyacente depende de la implementación de ArrayList . Sin embargo, dado que el tamaño de la matriz subyacente no se puede aumentar dinámicamente, se crea una nueva matriz y los elementos de la matriz anterior se copian en la nueva matriz.
La operación de suma tiene un costo de tiempo amortizado constante. En otras palabras, agregar n elementos a una ArrayList requiere O (n) tiempo.
2.3. Tipos de elementos
Una matriz puede contener tipos de datos primitivos y no primitivos, según la definición de la matriz. Sin embargo, una ArrayList solo puede contener tipos de datos no primitivos .
Cuando insertamos elementos con tipos de datos primitivos en una ArrayList , el compilador de Java convierte automáticamente el tipo de datos primitivos en su clase contenedora de objeto correspondiente.
Veamos ahora cómo agregar e insertar elementos en matrices Java y ArrayList .
3. Agregar un elemento
Como ya hemos visto, las matrices son de tamaño fijo.
Entonces, para agregar un elemento, primero, necesitamos declarar una nueva matriz que sea más grande que la matriz anterior y copiar los elementos de la matriz anterior a la matriz recién creada. Después de eso, podemos agregar el nuevo elemento a esta matriz recién creada.
Veamos su implementación en Java sin usar ninguna clase de utilidad:
public Integer[] addElementUsingPureJava(Integer[] srcArray, int elementToAdd) { Integer[] destArray = new Integer[srcArray.length+1]; for(int i = 0; i < srcArray.length; i++) { destArray[i] = srcArray[i]; } destArray[destArray.length - 1] = elementToAdd; return destArray; }
Alternativamente, la clase Arrays proporciona un método de utilidad copyOf () , que ayuda a crear una nueva matriz de mayor tamaño y a copiar todos los elementos de la matriz anterior:
int[] destArray = Arrays.copyOf(srcArray, srcArray.length + 1);
Una vez que hemos creado una nueva matriz, podemos agregar fácilmente el nuevo elemento a la matriz:
destArray[destArray.length - 1] = elementToAdd;
Por otro lado, agregar un elemento en ArrayList es bastante fácil :
anArrayList.add(newElement);
4. Insertar un elemento en el índice
Insertar un elemento en un índice determinado sin perder los elementos añadidos previamente no es una tarea sencilla en las matrices.
En primer lugar, si la matriz ya contiene la cantidad de elementos igual a su tamaño, primero debemos crear una nueva matriz con un tamaño mayor y copiar los elementos en la nueva matriz.
Además, necesitamos desplazar todos los elementos que vienen después del índice especificado en una posición a la derecha:
public static int[] insertAnElementAtAGivenIndex(final int[] srcArray, int index, int newElement) { int[] destArray = new int[srcArray.length+1]; int j = 0; for(int i = 0; i < destArray.length-1; i++) { if(i == index) { destArray[i] = newElement; } else { destArray[i] = srcArray[j]; j++; } } return destArray; }
Sin embargo, la clase ArrayUtils nos brinda una solución más simple para insertar elementos en una matriz :
int[] destArray = ArrayUtils.insert(2, srcArray, 77);
Tenemos que especificar el índice en el que queremos insertar el valor, la matriz de origen y el valor a insertar.
El método insert () devuelve una nueva matriz que contiene una mayor cantidad de elementos, con el nuevo elemento en el índice especificado y todos los elementos restantes desplazados una posición a la derecha.
Tenga en cuenta que el último argumento del método insert () es un argumento variable, por lo que podemos insertar cualquier número de elementos en una matriz.
Usémoslo para insertar tres elementos en srcArray comenzando en el índice dos:
int[] destArray = ArrayUtils.insert(2, srcArray, 77, 88, 99);
Y los elementos restantes se desplazarán tres lugares a la derecha.
Además, esto se puede lograr de manera trivial para ArrayList :
anArrayList.add(index, newElement);
ArrayList desplaza los elementos e inserta el elemento en la ubicación requerida.
5. Conclusión
En este artículo, analizamos la matriz de Java y ArrayList . Además, analizamos las similitudes y diferencias entre los dos. Finalmente, vimos cómo agregar e insertar elementos en una matriz y ArrayList .
Como siempre, el código fuente completo de los ejemplos de trabajo está disponible en GitHub.