Вопрос-ответ

Converting array to list in Java

Преобразование массива в список в Java

Как мне преобразовать массив в список в Java?

Я использовал Arrays.asList() но поведение (и сигнатура) каким-то образом изменилось с Java SE 1.4.2 (документы сейчас в архиве) на 8, и большинство фрагментов, которые я нашел в Интернете, используют поведение 1.4.2.

Например:

int[] numbers = new int[] { 1, 2, 3 };
Arrays.asList(numbers)

  • в версии 1.4.2 возвращается список, содержащий элементы 1, 2, 3

  • в версии 1.5.0+ возвращает список, содержащий массив 'numbers'

Во многих случаях это должно быть легко обнаружить, но иногда это может остаться незамеченным:

Assert.assertTrue(Arrays.asList(numbers).indexOf(4) == -1);
Переведено автоматически
Ответ 1

В вашем примере это связано с тем, что у вас не может быть списка примитивного типа. Другими словами, List<int> это невозможно.

Вы можете, однако, иметь List<Integer> используя Integer класс, который оборачивает int примитив. Преобразуйте свой массив в List с помощью Arrays.asList служебного метода.

Integer[] numbers = new Integer[] { 1, 2, 3 };
List<Integer> list = Arrays.asList(numbers);

Смотрите, как этот код выполняется в режиме реального времени по адресу IdeOne.com .

Ответ 2

В Java 8 вы можете использовать потоки:

int[] numbers = new int[] { 1, 2, 3 };
Arrays.stream(numbers)
.boxed()
.collect(Collectors.toList());
Ответ 3

Мы не можем иметь, List<int> поскольку int это примитивный тип, поэтому мы можем иметь только List<Integer>.

Java 16

Java 16 представляет новый метод в Stream API под названием toList(). Этот удобный метод возвращает неизменяемый список, содержащий элементы stream. Итак, попытка добавить новый элемент в список просто приведет к UnsupportedOperationException.

int[] ints = new int[] {1,2,3,4,5};
Arrays.stream(ints).boxed().toList();

Java 8 (int array)

int[] ints = new int[] {1,2,3,4,5};
List<Integer> list11 =Arrays.stream(ints).boxed().collect(Collectors.toList());

Java 8 и ниже (Целочисленный массив)

Integer[] integers = new Integer[] {1,2,3,4,5};
List<Integer> list21 = Arrays.asList(integers); // returns a fixed-size list backed by the specified array.
List<Integer> list22 = new ArrayList<>(Arrays.asList(integers)); // good
List<Integer> list23 = Arrays.stream(integers).collect(Collectors.toList()); //Java 8 only

Нужен ArrayList, а не List?

В случае, если нам нужна конкретная реализация, List например ArrayList, мы можем использовать toCollection как:

ArrayList<Integer> list24 = Arrays.stream(integers)
.collect(Collectors.toCollection(ArrayList::new));

Почему list21 нельзя изменить структуру?

Когда мы используем Arrays.asList размер возвращаемого списка фиксирован, потому что возвращаемый список - это не java.util.ArrayList, а частный статический класс, определенный внутри java.util.Arrays. Итак, если мы добавим или удалим элементы из возвращаемого списка, будет выдан UnsupportedOperationException. Итак, мы должны использовать list22, когда мы хотим изменить список. Если у нас есть Java8, то мы также можем использовать list23.

Для ясности list21 может быть изменен в том смысле, что мы можем вызывать list21.set(index,element) но этот список не может быть изменен структурно, т. Е. Нельзя добавлять или удалять элементы из списка. Вы также можете проверить этот мой ответ для получения дополнительных объяснений.


Если нам нужен неизменяемый список, мы можем обернуть его следующим образом:

List<Integer> list22 = Collections.unmodifiableList(Arrays.asList(integers));

Еще один момент, который следует отметить, заключается в том, что метод Collections.unmodifiableList возвращает неизменяемое представление указанного списка. Неизменяемая коллекция представлений - это неизменяемая коллекция, которая также является представлением резервной коллекции. Обратите внимание, что изменения в резервной коллекции все еще могут быть возможны, и если они произойдут, они будут видны в неизменяемом представлении.

Мы можем получить действительно неизменяемый список в Java 9 и 10.

Действительно неизменяемый список

Java 9:

String[] objects = {"Apple", "Ball", "Cat"};
List<String> objectList = List.of(objects);

Java 10 (действительно неизменяемый список):

Мы можем использовать List.of представленный в Java 9. Также есть другие способы:


  1. List.copyOf(Arrays.asList(integers))

  2. Arrays.stream(integers).collect(Collectors.toUnmodifiableList());

Ответ 4

Говоря о способе преобразования, это зависит от того, зачем вам нужен ваш List. Если вам это нужно просто для чтения данных. Хорошо, поехали:

Integer[] values = { 1, 3, 7 };
List<Integer> list = Arrays.asList(values);

Но тогда, если вы сделаете что-то подобное:

list.add(1);

вы получаете java.lang.UnsupportedOperationException.
Итак, в некоторых случаях вам даже нужно это:

Integer[] values = { 1, 3, 7 };
List<Integer> list = new ArrayList<Integer>(Arrays.asList(values));

Первый подход фактически не преобразует массив, а "представляет" его как List. Но массив находится под капотом со всеми его свойствами, такими как фиксированное количество элементов. Пожалуйста, обратите внимание, что вам необходимо указать тип при построении ArrayList.

java arrays list