Arrays.asList()
no se puede aplicar a los arrays de tipo primitivo como se espera. Cuando se aplica a int[]
, Arrays.asList()
produce una lista de int[]
s en lugar de la lista de Integer
s. Por lo tanto, baraja una lista recién creada de int[]
.
Este es un comportamiento sutil de argumentos variados y genéricos en Java. Arrays.asList()
está declarada como
public static <T> List<T> asList(T... a)
lo tanto, puede tomar varios argumentos de algún tipo T
y producir una lista que contiene estos argumentos, o puede tomar un argumento de tipo T[]
y devolver una lista de respaldo de esta matriz (que es como los argumentos variados funcionan).
Sin embargo, la última opción sólo funciona cuando T
es un tipo de referencia (es decir, no un primitivo tipo tal como int
), debido a que sólo los tipos de referencia se pueden utilizar como parámetros de tipo en genéricos (y T
es un parámetro de tipo).
Por lo tanto, si pasa int[]
, obtiene T
= int[]
, y su código no funciona como se esperaba. Pero si se pasa matriz de tipo de referencia (por ejemplo, Integer[]
), se obtiene T
= Integer
y todo funciona:
Integer[] arr = new Integer[10];
for (int i = 0; i < arr.length; i++) {
arr[i] = i;
}
Collections.shuffle(Arrays.asList(arr));
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
¡GUAU! Pero todos dijeron que los cambios se aplicaron a la lista, no con la matriz arr. ¿Por qué funciona esto? – Dmitry
Porque Arrays.asList() crea una nueva lista respaldada por la matriz. No copia la matriz como otros han indicado. Cada cambio en la lista devuelta por Arrays.asList() también cambia la matriz que lo respalda. – ILMTitan
Entendido ahora. Pero ¿por qué eso no funciona con los tipos primitivos? – Dmitry