У меня есть массив, который инициализируется как:
Element[] array = {new Element(1), new Element(2), new Element(3)};
Я хотел бы преобразовать этот массив в объект ArrayList
класса.
ArrayList<Element> arraylist = ???;
java
arrays
arraylist
type-conversion
Рон Туффин
источник
источник
ArrayList
. Афиша просила специально для этого.Ответы:
источник
new ArrayList
вызов также не нужен.List<ClassName> list = Arrays.asList(array)
Arrays.asList(array)
без передачи его в новыйArrayList
объект будет фиксировать размер списка. Одной из наиболее распространенных причин использованияArrayList
является возможность динамически изменять его размер, и ваше предложение предотвратит это.Данный:
Самый простой ответ:
Это будет работать нормально. Но некоторые предостережения:
ArrayList
. В противном случае вы получитеUnsupportedOperationException
.asList()
, поддерживается исходным массивом. Если вы измените исходный массив, список также будет изменен. Это может быть удивительно.источник
java.util.ArrayList
. Arrays.asList фактически возвращает класс,java.util.Arrays.ArrayList
который не являетсяinstanceof
другим классом. Поэтому третье предостережение заключается в том, что если вы попытаетесь использовать его в контексте, требующем вышеуказанного, он не будет работать.(старая ветка, но всего 2 цента, так как никто не упоминает Guava или других библиотек и некоторые другие детали)
Если можете, используйте гуаву
Стоит указать путь гуавы, который значительно упрощает эти махинации:
Применение
Для неизменного списка
Используйте
ImmutableList
класс и его методыof()
иcopyOf()
методы фабрики (элементы не могут быть нулевыми) :Для изменяемого списка
Используйте
Lists
класс и егоnewArrayList()
фабричные методы:Также обратите внимание на аналогичные методы для других структур данных в других классах, например, в
Sets
.Почему гуава?
Основная привлекательность может заключаться в уменьшении беспорядка из-за обобщений для безопасности типов, поскольку использование фабричных методов Гуавы позволяет выводить типы в большинстве случаев. Тем не менее, этот аргумент содержит меньше воды, так как Java 7 прибыл с новым оператором Diamond.
Но это не единственная причина (и Java 7 еще не везде): сокращенный синтаксис также очень удобен, а инициализаторы методов, как показано выше, позволяют писать более выразительный код. Вы делаете в одном вызове Guava то, что занимает 2 с текущими коллекциями Java.
Если ты не можешь ...
Для неизменного списка
Используйте
Arrays
класс JDK и егоasList()
фабричный метод, заключенный вCollections.unmodifiableList()
:Обратите внимание, что возвращаемый тип для
asList()
являетсяList
использованием конкретнойArrayList
реализации, но это не такjava.util.ArrayList
. Это внутренний тип, который эмулирует,ArrayList
но на самом деле напрямую ссылается на переданный массив и заставляет его «проходить через» (изменения отражаются в массиве).Он запрещает модификацию некоторых методов
List
API путем простого расширенияAbstractList
(поэтому добавление или удаление элементов не поддерживается), однако он допускает вызовыset()
для переопределения элементов. Таким образом, этот список не является действительно неизменным, и вызовasList()
должен быть заключен вCollections.unmodifiableList()
.Смотрите следующий шаг, если вам нужен изменяемый список.
Для изменяемого списка
То же, что и выше, но обернуто фактическим
java.util.ArrayList
:Для образовательных целей: хороший старый ручной путь
источник
List
возвращаемое значениеArrays.asList
является изменяемым, поскольку вы все еще можетеset
элементы - оно просто не может быть изменено. Для неизменяемых списков без гуавы вы могли бы упомянутьCollections.unmodifiableList
.arrayToList
для Java 1.5+ неверен. Вы создаете экземпляры списковString
и пытаетесь получить строки из данного массива вместо использования общего типа параметраT
. Кроме этого, хороший ответ и +1 за то, что он единственный, включая ручной способ.O(1)
, но для неизменности вы должны сделать копию, например, с помощьюCollections.unmodifiableList(new ArrayList<>(Arrays.asList(array)))
.Поскольку этот вопрос довольно старый, меня удивляет, что никто еще не предложил простейшую форму:
Начиная с Java 5,
Arrays.asList()
принимает параметр varargs, и вам не нужно явно создавать массив.источник
List<String> a = Arrays.asList("first","second","third")
Убедитесь, что
myArray
это тот же тип, что иT
. Вы получите ошибку компилятора, если попытаетесь создать , например,List<Integer>
из массиваint
.источник
Другой способ (хотя по сути эквивалентный
new ArrayList(Arrays.asList(array))
решению с точки зрения производительности:источник
Java 9
В Java 9 вы можете использовать
List.of
статический метод фабрики для созданияList
литерала. Что-то вроде следующего:Это вернет неизменный список, содержащий три элемента. Если вы хотите непостоянный список, передайте этот список
ArrayList
конструктору:JEP 269: методы фабрики удобства для коллекций
JEP 269 предоставляет некоторые удобные фабричные методы для API коллекций Java . Эти неизменные статические фабричные методы встроены в
List
,Set
иMap
интерфейсы в Java 9 и более поздних версий.источник
Вам, вероятно, просто нужен список, а не ArrayList. В этом случае вы можете просто сделать:
источник
set
метод), вы не можете изменить размер списка (нетadd
илиremove
элементы)!Еще одно обновление, почти заканчивающееся 2014 годом, вы можете сделать это и с Java 8:
Несколько символов будут сохранены, если это может быть просто
List
источник
Collectors.toList()
самом деле возвращаетArrayList
.Если вы используете:
Вы можете создать и заполнить два списка! Заполнение дважды большого списка - это именно то, что вы не хотите делать, потому что он будет создавать новый
Object[]
массив каждый раз, когда необходимо увеличить емкость.К счастью, реализация JDK быстрая и
Arrays.asList(a[])
очень хорошо сделана. Он создает вид ArrayList с именем Arrays.ArrayList, где данные Object [] указывают непосредственно на массив.Опасная сторона в том, что если вы измените исходный массив, вы измените список! Вы уверены, что хотите этого? Может да может нет.
Если нет, то самый понятный способ сделать это:
Или, как сказал @glglgl, вы можете создать еще один независимый ArrayList с помощью:
Я люблю использовать
Collections
,Arrays
, или Guava. Но если он не подходит или вы этого не чувствуете, просто напишите еще одну не элегантную строку.источник
new ArrayList<T>(Arrays.asList(myArray));
частью, которую вы не хотите использовать. Оба делают одно и то же и имеют одинаковую сложность.new ArrayList<T>(Arrays.asList(myArray));
делает то же самое, он копируетasList
АньArrayList
...В
Java 9
вы можете использовать:источник
В соответствии с вопросом ответ с использованием Java 1.7:
Однако лучше всегда использовать интерфейс:
источник
источник
Вы можете конвертировать, используя разные методы
List<Element> list = Arrays.asList(array);
List<Element> list = new ArrayList();
Collections.addAll(list, array);
Arraylist list = new Arraylist();
list.addAll(Arrays.asList(array));
Для получения более подробной информации вы можете обратиться к http://javarevisited.blogspot.in/2011/06/converting-array-to-arraylist-in-java.html
источник
как все сказали, так и будет
и самый распространенный способ создания массива - observableArrays
ObservableList: список, который позволяет слушателям отслеживать изменения, когда они происходят.
для Java SE вы можете попробовать
то есть согласно Oracle Docs
Обновите Java 9
также в Java 9 это немного просто:
источник
Начиная с Java 8 существует более простой способ преобразования:
источник
Вы также можете сделать это с потоком в Java 8.
источник
Collectors.toList()
вернетArrayList
. Однако это может отличаться в будущих версиях java. Если вы хотите определенный тип коллекции, используйтеCollectors.toCollection()
вместо нее, где вы можете указать, какой именно тип коллекции вы хотите создать.Если мы увидим определение
Arrays.asList()
метода, вы получите что-то вроде этого:Итак, вы можете инициализировать
arraylist
так:Там может быть другой ответ на этот вопрос тоже.
Если вы видите объявление для
java.util.Collections.addAll()
метода, вы получите что-то вроде этого:Таким образом, этот код также полезен для этого
источник
Другой простой способ - добавить все элементы из массива в новый ArrayList, используя цикл for-each.
источник
Если массив имеет примитивный тип, данные ответы не будут работать. Но начиная с Java 8 вы можете использовать:
источник
char
массивом.Вы можете сделать это в Java 8 следующим образом
источник
ArrayList<String> list = Arrays.stream(array).collect(Collectors.toCollection(ArrayList::new));
Мы можем легко преобразовать массив в
ArrayList
. Мы используемaddAll()
метод интерфейса Collection для копирования содержимого из одного списка в другой.источник
ArrayList
конструкторов принимает? extends Collection<T>
аргумент, делая вызовaddAll
избыточным.Хотя на этот вопрос есть много прекрасно написанных ответов, я добавлю свои комментарии.
Скажи у тебя есть
Element[] array = { new Element(1), new Element(2), new Element(3) };
Новый ArrayList может быть создан следующими способами
И они очень хорошо поддерживают все операции ArrayList
Но следующие операции возвращают только представление списка ArrayList, а не фактический ArrayList.
Поэтому они будут выдавать ошибку при попытке выполнить некоторые операции ArrayList
Подробнее о представлении списка ссылки на массив .
источник
Самый простой способ сделать это - добавить следующий код. Пробовал и проверял.
источник
Вывод ...
Привет,
мир
источник
Используйте следующий код для преобразования массива элементов в ArrayList.
источник
Уже каждый предоставил достаточно хороший ответ для вашей проблемы. Теперь из всех предложений, вам нужно решить, что будет соответствовать вашим требованиям. Есть два типа коллекций, которые вам нужно знать. Один - это немодифицированная коллекция, а другая - коллекция, которая позволит вам позже изменить объект.
Итак, здесь я приведу краткий пример для двух вариантов использования.
Создание неизменной коллекции :: Если вы не хотите изменять объект коллекции после создания
List<Element> elementList = Arrays.asList(array)
Создание изменяемой коллекции :: Когда вы можете захотеть изменить созданный объект коллекции после создания.
List<Element> elementList = new ArrayList<Element>(Arrays.asList(array));
источник
List
возвращаемое значениеArrays.asList
является просто оберткой над исходным массивом и позволяет отдельным элементам получать доступ и изменять их с помощьюget
иset
. Вы, вероятно, должны уточнить, что вы имеете в виду «не добавлять и не удалять элементы» вместо «неизменяемый», что означает вообще не изменять.Данный объектный массив:
Преобразовать массив в список:
Конвертировать массив в ArrayList
Конвертировать массив в LinkedList
Список печати:
ВЫВОД
1
2
3
источник
Класс Arrays в Java 8 предоставляет метод stream () с перегруженными версиями, принимающими как примитивные, так и объектные массивы.
источник
Ниже код кажется хорошим способом сделать это.
источник