Arrays.asList vs nueva ArrayList (Arrays.asList ())

1. Información general

En este breve tutorial, veremos las diferencias entre Arrays.asList (array) y ArrayList (Arrays.asList (array)).

2. Arrays.asList

Comencemos con el método Arrays.asList .

Con este método, podemos convertir de una matriz a un objeto List de tamaño fijo . Esta lista es solo un contenedor que hace que la matriz esté disponible como una lista. No se copia ni se crea ningún dato .

Además, no podemos modificar su longitud porque no se permite agregar o quitar elementos .

Sin embargo, podemos modificar elementos individuales dentro de la matriz. Tenga en cuenta que todas las modificaciones que hagamos a los elementos individuales de la Lista se reflejarán en nuestra matriz original :

String[] stringArray = new String[] { "A", "B", "C", "D" }; List stringList = Arrays.asList(stringArray); 

Ahora, veamos qué sucede si modificamos el primer elemento de stringList :

stringList.set(0, "E"); assertThat(stringList).containsExactly("E", "B", "C", "D"); assertThat(stringArray).containsExactly("E", "B", "C", "D");

Como podemos ver, nuestra matriz original también fue modificada. Tanto la lista como la matriz ahora contienen exactamente los mismos elementos en el mismo orden.

Intentemos ahora insertar un nuevo elemento en stringList :

stringList.add("F");
java.lang.UnsupportedOperationException at java.base/java.util.AbstractList.add(AbstractList.java:153) at java.base/java.util.AbstractList.add(AbstractList.java:111)

Como podemos ver, agregar / eliminar elementos a / de la Lista arrojará java.lang.UnsupportedOperationException .

3. ArrayList (Arrays.asList (matriz))

De manera similar al método Arrays.asList , podemos usar ArrayList (Arrays.asList (array)) cuando necesitamos crear una lista a partir de una matriz .

Pero, a diferencia de nuestro ejemplo anterior, esta es una copia independiente de la matriz, lo que significa que modificar la nueva lista no afectará a la matriz original . Además, tenemos todas las capacidades de una ArrayList normal , como agregar y eliminar elementos:

String[] stringArray = new String[] { "A", "B", "C", "D" }; List stringList = new ArrayList(Arrays.asList(stringArray)); 

Ahora modifiquemos el primer elemento de stringList :

stringList.set(0, "E"); assertThat(stringList).containsExactly("E", "B", "C", "D");

Y ahora, veamos qué pasó con nuestra matriz original:

assertThat(stringArray).containsExactly("A", "B", "C", "D");

Como podemos ver, nuestra matriz original permanece intacta .

Antes de terminar, si echamos un vistazo al código fuente de JDK, podemos ver que el método Arrays.asList devuelve un tipo de ArrayList que es diferente de java.util.ArrayList . La principal diferencia es que la ArrayList devuelta solo envuelve una matriz existente, no implementa los métodos de agregar y quitar .

4. Conclusión

En este breve artículo, analizamos las diferencias entre dos formas de convertir una matriz en una ArrayList . Vimos cómo se comportan esas dos opciones y la diferencia entre cómo implementan sus matrices internas.

Como siempre, los ejemplos de código se pueden encontrar en GitHub.