Преобразование массива в список в Java
я использовал Arrays.asList() но поведение (и подпись) как-то изменилось с Java SE 1.4.2 (документы теперь в архиве) к 8 и большинство фрагментов, которые я нашел в интернете, используют поведение 1.4.2.
- on 1.4.2 возвращает список, содержащий элементы 1, 2, 3
- на 1.5.0+ возвращает список, содержащий массив спам
во многих случаях это должно быть легко обнаружить, но иногда она может проскользнуть незамеченной:
17 ответов
в вашем примере это потому, что вы не можете иметь список примитивного типа. Другими словами, List<int> не возможно. Вы можете, однако, иметь List<Integer> .
это работает, как ожидалось.
проблема в том, что varargs был представлен в Java5 и, к сожалению, Arrays.asList() перегружен версией vararg. Так что Arrays.asList(spam) понимается компилятором Java5 как параметр vararg массивов int.
эта проблема объясняется более подробно в эффективном Java 2nd Ed. Глава 7, Пункт 42.
говоря о способе преобразования, это зависит от того, зачем вам нужен ваш List . Если вам нужно просто прочитать данные. ОК, Вот так:
но тогда, если вы делаете что-то вроде этого:
вы получаете java.lang.UnsupportedOperationException . Поэтому для некоторых случаев вам даже нужно это:
первый подход фактически не преобразует массив, но «представляет» его как List . Но массив находится под капотом со всеми его свойствами, такими как фиксированное количество элементов. Пожалуйста, обратите внимание, вы необходимо указать тип при построении ArrayList .
в Java 8 вы можете использовать streams:
кажется, немного поздно, но вот мои два цента. Мы не можем иметь List<int> as int является примитивным типом, поэтому мы можем иметь только List<Integer> .
Java 8 (int array)
Java 8 и ниже (целочисленный массив)
нужен ArrayList, а не список?
в случае, если мы хотим конкретную реализацию List например ArrayList затем мы можем использовать toCollection as:
почему list21 не может быть структурно модифицированных?
при использовании Arrays.asList размер возвращаемого списка фиксирован, потому что возвращаемый список не java.util.ArrayList , но частный статический класс, определенный внутри java.util.Arrays . Поэтому, если мы добавим или удалим элементы из возвращаемого списка, UnsupportedOperationException будет брошен. Поэтому мы должны пойти с list22 когда мы хотим изменить список. Если у нас есть Java8, то мы также можем пойти с list23 .
для ясности list21 может быть изменен в том смысле, что мы можем вызвать list21.set(index,element) но этот список не может быть структурно изменен, т. е. не может добавлять или удалять элементы из списка. Вы также можете проверить это вопрос.
если мы хотим неизменяемый список, то мы можем обернуть его как:
еще один момент, чтобы отметить, что метод Collections.unmodifiableList возвращает неизменяемое представление указанного списка. Немодифицируемая коллекция представлений-это немодифицируемая коллекция, а также представление резервной коллекции. Заметить что изменения в резервной коллекции все еще могут быть возможны, и если они происходят, они видны через немодифицируемое представление.
у нас может быть действительно неизменяемый список в Java 10.
Java 10 (действительно неизменяемый список) двумя способами:
- List.copyOf(Arrays.asList(integers))
- Arrays.stream(integers).collect(Collectors.toUnmodifiableList());
также проверьте это ответ шахты для более.
недавно мне пришлось преобразовать массив в список. Позже программа отфильтровала список, пытаясь удалить данные. При использовании массивов.функция asList(array), вы создаете коллекцию фиксированного размера: вы не можете ни добавлять, ни удалять. Эта запись объясняет проблему лучше, чем я: почему я получаю исключение UnsupportedOperationException при попытке удалить элемент из списка?.
в конце концов, мне пришлось сделать «ручное» преобразование:
I предположим, я мог бы добавить преобразование из массива в список, используя список.операция addAll (items).
Использование Массивов
это самый простой способ преобразовать массив в List . Однако при попытке добавить новый элемент или удалить существующий элемент из списка, UnsupportedOperationException будет брошен.
использование ArrayList или других реализаций списка
можно использовать for цикл для добавления всех элементов массива в List реализации, например, ArrayList :
использование Stream API в Java 8
вы можно превратить массив в поток, а затем собрать поток с помощью разных коллекторов: коллектор по умолчанию в Java 8 использует ArrayList за экраном, но вы также можете наложить предпочтительную реализацию.
если вы нацелены на Java 8( или более поздней версии), вы можете попробовать следующее:
обратите внимание Collectors.<Integer>toList() , этот общий метод поможет вам избежать ошибки » тип несоответствия: не удается преобразовать из List<Object> to List<Integer> «.
Convert an Array to a List in Java
This post will discuss how to convert an array to a list using plain Java, Guava, and Apache Commons Collections.
There are two general-purpose list implementations in Java — ArrayList and LinkedList . This post will use ArrayList , which offers constant-time positional access and is just plain fast.
1. Naive solution
A naive solution is to create an empty list and push every element of the specified array into the list.
Create ArrayList from array
I would like to convert this array into an object of the ArrayList class.
![]()
41 Answers 41
The simplest answer is to do:
This will work fine. But some caveats:
- The list returned from asList has fixed size. So, if you want to be able to add or remove elements from the returned list in your code, you’ll need to wrap it in a new ArrayList . Otherwise you’ll get an UnsupportedOperationException .
- The list returned from asList() is backed by the original array. If you modify the original array, the list will be modified as well. This may be surprising.
![]()
(old thread, but just 2 cents as none mention Guava or other libs and some other details)
If You Can, Use Guava
It’s worth pointing out the Guava way, which greatly simplifies these shenanigans:
Usage
For an Immutable List
Use the ImmutableList class and its of() and copyOf() factory methods (elements can’t be null) :
For A Mutable List
Use the Lists class and its newArrayList() factory methods:
Please also note the similar methods for other data structures in other classes, for instance in Sets .
Why Guava?
The main attraction could be to reduce the clutter due to generics for type-safety, as the use of the Guava factory methods allow the types to be inferred most of the time. However, this argument holds less water since Java 7 arrived with the new diamond operator.
But it’s not the only reason (and Java 7 isn’t everywhere yet): the shorthand syntax is also very handy, and the methods initializers, as seen above, allow to write more expressive code. You do in one Guava call what takes 2 with the current Java Collections.