Непосредственная установка значений для ArrayList в Java

Настройка списка значений для Java ArrayList работает:

Integer[] a = {1,2,3,4,5,6,7,8,9};
ArrayList<Integer> possibleValues2 = new ArrayList<Integer>(Arrays.asList(a));

Однако следующее не работает и имеет ошибку "Незаконное начало типа", а также другое. Почему нет? Поскольку первая строка в первом блоке кода является просто назначением, разве это не должно иметь эффекта?

ArrayList<Integer> possibleValues2 = new ArrayList<Integer>(Arrays.asList({1,2,3,4,5,6,7,8,9}));

Ответ 1

Вы должны использовать либо версию vararg Arrays.asList, например.

ArrayList<Integer> possibleValues2 =
    new ArrayList<Integer>(Arrays.asList(1,2,3,4,5,6,7,8,9));

или явно создать параметр массива, например

ArrayList<Integer> possibleValues2 =
    new ArrayList<Integer>(Arrays.asList(new Integer[]{1,2,3,4,5,6,7,8,9}));

Ответ 2

Странная и мало используемая идиома,

List<Integer> ints = new ArrayList<Integer>() {{add(1); add(2); add(3);}}

Это создает анонимный класс, который расширяет ArrayList (внешние скобки), а затем реализует инициализатор экземпляра (внутренние скобки) и вызывает там List.add().

Преимущество этого по сравнению с Arrays.asList() заключается в том, что он работает для любого типа коллекции:

Map<String,String> m = new HashMap<>() {{ 
  put("foo", "bar");
  put("baz", "buz"); 
  ...
}}

Ответ 3

Другой вариант - использовать Guava ( "Коллекции Google" ), который имеет Lists.newArrayList(...).

Ваш код будет похож на

ArrayList<Integer> possibleValues2 = Lists.newArrayList(1,2,3,4,...);

Ответ 4

Из Java 7 SE docs:

List<Integer> possibleValues2 = Arrays.asList(1,2,3,4,5,6,7,8,9);