El concepto de Java Collections Views

Java Collections Views es uno de los conceptos que más suele sorprender  a los programadores cuando comienzan a trabajar con el framework de colecciones de Java. Imaginemonos que disponemos del siguiente Array de Strings en Java.


String[] listatexto = new String[] { "hola", "que", "tal" };

En muchas ocasiones querremos convertir al Array de Strings en un List de Strings. Esta operación es muy sencilla y la podemos realizar a través de la clase Arrays y su método toList().  Hecho esto el siguiente paso es recorrer la lista con una estructura forEach.


List<String> lista = Arrays.asList(listatexto);

for (String s : lista) {

System.out.println(s);

}

Todo funciona correctamente:

Parece que el JDK nos ha realizado una copia de nuestro Array a una estructura de lista.

Sin embargo esta apreciación no  es correcta ya que lo que se ha hecho no es una copia , sino que se ha generado una “Vista” diferente sobre los mismos datos.

Esto lo podemos comprobar simplemente cambiando uno de los elementos del Array original.


String[] listatexto = new String[] { "hola", "que", "tal" };

List<String> lista = Arrays.asList(listatexto);

for (String s : lista) {

System.out.println(s);

}

listatexto[1] = "QUE";

for (String s : lista) {

System.out.println(s);

}

Volvemos a recorrer la lista que habíamos construido y nos podremos dar cuenta que sin haber hecho ninguna modificación a la lista nueva esta se ve afectada por los cambios. Esto se debe a que no hemos construido una nueva Lista sino que hemos generado una vista sobre los datos originales.

Este tipo de situaciones se produce en muchas situaciones a la hora de utilizar el framework de colecciones . Un caso similar al anterior es el manejo de sublistas que tienen el mismo comportamiento.


List<String> otraLista= new ArrayList<String>();

otraLista.add("Programando");
otraLista.add("con");
otraLista.add("Java");

List<String> nueva= otraLista.subList(0, 2);

for (String s : nueva) {

System.out.println(s);

}

otraLista.set(1, "EN");


for (String s : nueva) {

System.out.println(s);

}

En este caso generamos una sublista “nueva” a partir de la lista original “otraLista” . Sin embargo cuando cambiemos la original la sublista se ve afectada.

Tengamos en cuenta estos conceptos cuando trabajamos con el framework de colecciones de Java .

Otros artículos relacionados: Java Generics , Colecciones y Google Guava , Java Collections List vs Set