Extensión de la longitud de una matriz

1. Información general

En este tutorial, veremos las diferentes formas en que podemos extender una matriz de Java.

Dado que las matrices son un bloque de memoria contiguo, la respuesta puede no ser evidente, pero analicemos eso ahora.

2. Uso de Arrays.copyOf

Primero, veamos Arrays.copyOf . Copiaremos la matriz y agregaremos un nuevo elemento a la copia:

public Integer[] addElementUsingArraysCopyOf(Integer[] srcArray, int elementToAdd) { Integer[] destArray = Arrays.copyOf(srcArray, srcArray.length + 1); destArray[destArray.length - 1] = elementToAdd; return destArray; }

La forma en que funciona Arrays.copyOf es que toma srcArray y copia el número de elementos especificados en el argumento de longitud en una nueva matriz que crea internamente. El tamaño de la nueva matriz es el argumento que proporcionamos.

Una cosa a tener en cuenta es que cuando el argumento de longitud es mayor que el tamaño de la matriz de origen, Arrays.copyOf llenará los elementos adicionales en la matriz de destino con nulo .

Dependiendo del tipo de datos, el comportamiento del relleno será diferente. Por ejemplo, si usamos tipos de datos primitivos en lugar de Integer , los elementos adicionales se rellenan con ceros. En el caso de char , Arrays.copyOf rellenará los elementos adicionales con null y en el caso de boolean, con false .

3. Usando ArrayList

La siguiente forma en que veremos es usando ArrayList.

Primero convertiremos la matriz en una ArrayList y luego agregaremos el elemento. Luego convertiremos ArrayList nuevamente en una matriz :

public Integer[] addElementUsingArrayList(Integer[] srcArray, int elementToAdd) { Integer[] destArray = new Integer[srcArray.length + 1]; ArrayList arrayList = new ArrayList(Arrays.asList(srcArray)); arrayList.add(elementToAdd); return arrayList.toArray(destArray); }

Tenga en cuenta que hemos pasado srcArray convirtiéndolo en una colección. El srcArray será rellenar la matriz subyacente en el ArrayList .

Además, otra cosa a tener en cuenta es que hemos pasado la matriz de destino como argumento a toArray . Este método copiará la matriz subyacente a destArray .

4. Usando System.arraycopy

Finalmente, echaremos un vistazo a System.arraycopy , que es bastante similar a Arrays.copyOf :

public Integer[] addElementUsingSystemArrayCopy(Integer[] srcArray, int elementToAdd) { Integer[] destArray = new Integer[srcArray.length + 1]; System.arraycopy(srcArray, 0, destArray, 0, srcArray.length); destArray[destArray.length - 1] = elementToAdd; return destArray; }

Un hecho interesante es que Arrays.copyOf utiliza internamente este método.

Aquí podemos notar que copiamos los elementos de srcArray a destArray y luego agregamos el nuevo elemento a destArray .

5. Desempeño

Una cosa común en todas las soluciones es que tenemos que crear una nueva matriz de una forma u otra. La razón radica en cómo se asignan las matrices en la memoria. Una matriz contiene un bloque de memoria contiguo para una búsqueda súper rápida, por lo que no podemos simplemente cambiar su tamaño.

Esto, por supuesto, tiene un impacto en el rendimiento, especialmente para arreglos grandes. Esta es la razón por la que ArrayList sobreasigna , reduciendo efectivamente la cantidad de veces que la JVM necesita reasignar memoria.

Pero, si estamos haciendo muchas inserciones, una matriz podría no ser la estructura de datos correcta y deberíamos considerar una LinkedList .

6. Conclusión

En este artículo, hemos explorado las diferentes formas de agregar elementos al final de una matriz.

Y, como siempre, el código completo está disponible en GitHub.