Why does Collections.shuffle() fail for my array?
java, random-access, shuffle
Solution
`Arrays.asList()` can't be applied to arrays of primitive type as you expect. When applied to `int[]`, `Arrays.asList()` produces a list of `int[]`s instead of list of `Integer`s. Therefore you shuffle a newly created list of `int[]`.
This is a subtle behaviour of variadic arguments and generics in Java. `Arrays.asList()` is declared as
public static <T> List<T> asList(T... a)
So, it can take several arguments of some type `T` and produce a list containing these arguments, or it can take one argument of type `T[]` and return a list backed by this array (that's how variadic arguments work).
However, the latter option works only when `T` is a reference type (i.e. not a primitive type such as `int`), because only reference types may be used as type parameters in generics (and `T` is a type parameter).
So, if you pass `int[]`, you get `T` = `int[]`, and you code doesn't work as expected. But if you pass array of reference type (for example, `Integer[]`), you get `T` = `Integer` and everything works:
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] + " ");
}
Problem
Why does my code not work? ``` package generatingInitialPopulation; import java.util.Arrays; import java.util.Collections; public class TestShuffle { public static void main(String[] args) { int[] arr = new int[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] + " "); } } } ``` The result is: 0 1 2 3 4 5 6 7 8 9. I was expecting a randomly shuffled sequence.