В статье мы рассмотрим самые популярные способы преобразования Java массивов в коллекцию ArrayList.
Первым делом давайте посмотрим на массив, с которым мы будем работать:
1 |
ObjElement[] array = {new ObjElement(1), new ObjElement(2), new ObjElement(3)}; |
Массив каких-то объектов на 3 элемента.
Третье место. Используем метод Collections.addAll()
Посмотрим на примере:
1 2 3 |
ObjElement[] arrayOfObjects = {new ObjElement(1), new ObjElement(2), new ObjElement(3)}; List<ObjElement> listOfObjects = new ArrayList<ObjElement>(arrayOfObjects.length); Collections.addAll(listOfObjects, arrayOfObjects); |
Сначала мы создали пустой список listOfObjects такой же длины, что и массив с исходными данными. Потом используя метод Collections.addAll()
добавили все элементы массива arrayOfObjects в коллекцию listOfObjects.
Второе место. Используем метод Arrays.asList()
В этом популярном способе преобразования массива в список будет использован метод Arrays.asList()
:
1 |
List<ObjElement> listofObjects = Arrays.asList(arrayOfObjects); |
Да, это лаконичный и удобный способ, но явно не самый лучший. Все дело в том, что длина списка, который мы получим методом asList()
— фиксирована. На самом деле этот список не java.util.ArrayList
, а внутренний статический класс, определенный внутри java.util.Arrays
. Мы знаем, что этот ArrayList
реализован как массив, поэтому метод asList()
вернет список фиксированного размера на основании исходного массива. Таким образом, если мы попробуем добавлять или удалять элементы из такого списка, то получим UnsupportedOperationException
. Подробнее об этом читайте здесь.
ТОП-1. Конвертируем массив в ArrayList
Наиболее популярным является следующий способ:
1 2 |
ArrayList<ObjElement> arrayList = new ArrayList<ObjElement>(Arrays.asList(arrayOfObjects)); |
На первый взгляд этот метод мало чем отличается от первых двух, но давайте рассмотрим его подробнее:
Мы использовали конструктор ArrayList(Collection < ? extends E > c)
, который согласно JavaDoc создает список, содержащий элементы указанной коллекции, в том порядке, в котором они были возвращены итератором коллекции. Другими словами, сначала коллекция преобразуется в массив, а затем сохранится во внутреннем массиве elementData
. Под капотом это выглядит так:
1 2 3 4 5 6 7 8 |
public ArrayList(Collection<? extends E> c) { elementData = c.toArray(); size = elementData.length; // здесь Java проводит "магию" по сохранению данных как части ArrayList if (elementData.getClass() != Object[].class) elementData = Arrays.copyOf(elementData, size, Object[].class); } |
Как видите, каждый из способов выполняет поставленную перед ним задачу по созданию коллекции ArrayList из массива, но выбирать их нужно с умом.