Узнайте, как создать список из массива с помощью Arrays.asList(array) и new ArrayList(Arrays.asList(array). Список, созданный с помощью этих методов, отличается по-разному. Давайте рассмотрим некоторые основные различия между ними.
1. Введение
Arrays — это служебный класс, присутствующий в пакете java.util и существующий с версии Java 1.2. Он предоставляет различные служебные методы для работы с массивом объектов. Arrays.asList() — один из методов создания списка из заданного массива. Он не создает независимый объект списка, а возвращает представление списка, т. е. созданный список имеет фиксированный размер, и никакие элементы не могут быть добавлены или удалены из него.
public static List asList(Object[] arr)
Класс ArrayList, присутствующий в пакете java.util, расширяет класс AbstractList и реализует интерфейс List, и существует с версии Java 1.2. Мы можем создать List из существующего массива, используя один из конструкторов этого класса. Он создает независимый экземпляр List, который не имеет фиксированного размера и изменяется в соответствии с требованиями.
ArrayList list = new ArrayList(Arrays.asList(array))
2. Разница между Arrays.asList(массив) и new ArrayList(Arrays.asList(массив))
2.1. Возвращенный список
Arrays.asList(array) создает обертку List для базового массива и возвращает List типа java.util.Arrays.ArrayList, который отличается от java.util.ArrayList. Он дает представление списка для массива, и никакие элементы физически не копируются в созданный List.
// Defining String ArrayString[] stringArray = {"a", "b", "c"};// Creating List using Arrays.asList() methodList<String> listofStrings = Arrays.asList(stringArray);// Printing class nameSystem.out.println(listofStrings.getClass().getCanonicalName()); // java.util.Arrays.ArrayList
Список, созданный с помощью new ArrayList(Arrays.asList(array)) имеет тип класса java.util.ArrayList. Мы передаем обертку списка в конструктор ArrayList, а конструктор физически копирует из него все элементы и создает новый независимый объект ArrayList.
// Defining String ArrayString[] stringArray = {"a", "b", "c"};// Creating List using new ArrayList()List<String> listofStrings = new ArrayList<>(Arrays.asList(stringArray));// Printing class nameSystem.out.println(listofStrings.getClass().getCanonicalName()); // java.util.ArrayList
2.2 Добавление и удаление элементов
Arrays.asList(array) создает список фиксированного размера, поскольку массивы имеют фиксированную длину, а этот метод просто создает обертку списка для базового массива, поэтому созданный список также следует правилу фиксированного размера.
Мы не можем добавлять или удалять элементы в & из этого списка. Если мы попытаемся выполнить любую такую операцию, которая изменит размер списка, то список выдаст исключение UnsupportedOperationException.
Примечание: Мы не можем изменить размер списка, созданного с помощью метода Arrays.asList(), но мы можем заменить значение существующего элемента новым значением в этом списке, поскольку операция замены не изменит размер списка.
// Creating List using Arrays.asList() methodList<String> listofStrings = Arrays.asList(stringArray);// Printing listSystem.out.println(listofStrings); // [a, b, c]// Adding element to listlistofStrings.add(“d”); // Raises UnsupportedOperationException// Replacing element in listlistofStrings.set(0, “z”);// Printing listSystem.out.println(listofStrings); // [z, b, c]
ArrayList(Arrays.asList(array)) создает независимый список, который не имеет фиксированного размера; следовательно, мы можем добавлять/удалять и изменять элементы этого списка.
// Creating List using new ArrayList()List<String> listofStrings = new ArrayList<>(Arrays.asList(stringArray));// Printing listSystem.out.println(listofStrings); // [a, b, c]// Adding element to listlistofStrings.add(“d”);// Printing listSystem.out.println(listofStrings); // [a, b, c, d]// Replacing element in listlistofStrings.set(0, “z”);// Printing listSystem.out.println(listofStrings); // [z, b, c, d]
2.3 Внутренняя ссылка на базовый массив и список
И List, и базовый массив указывают на один и тот же объект в области памяти кучи, в случае, если List создан с помощью Arrays.asList(array). У нас нет двух отдельных объектов в памяти для входного массива и созданного List.

Используя new ArrayList(Arrays.asList(array)), мы получаем 2 отдельных объекта в области динамической памяти: один для входного массива, а другой для созданного списка.


2.4 Изменения в базовом массиве при изменении элементов списка
Как указано выше, в случае Arrays.asList(array) и входной массив, и созданный List указывают на один и тот же объект в памяти. Следовательно, используя ссылку на список, если мы выполним какое-либо изменение, то же самое изменение будет отражено в базовом массиве и наоборот.
// Creating List using Arrays.asList() methodList<String> listofStrings = Arrays.asList(stringArray);// Printing underlying array & listSystem.out.println(Arrays.toString(stringArray)); // [a, b, c]System.out.println(listofStrings); // [a, b, c]// Replacing element in listlistsofStrings.set(0, “z”);// Printing underlying array & list againSystem.out.println(Arrays.toString(stringArray)); // [z, b, c]System.out.println(listofStrings); // [z, b, c]
Для new ArrayList(Arrays.asList(array)) у нас есть 2 отдельных объекта: базовый массив и созданный список; изменение одного никак не повлияет на другой.
// Creating List new ArrayList()List<String> listofStrings = new ArrayList<>(Arrays.asList(stringArray));// Printing underlying array & listSystem.out.println(Arrays.toString(stringArray)); // [a, b, c]System.out.println(listofStrings); // [a, b, c]// Replacing element in listlistsofStrings.set(0, “z”);// Printing underlying array & list againSystem.out.println(Arrays.toString(stringArray)); // [a, b, c]System.out.println(listofStrings); // [z, b, c]
3. Когда использовать?
Если нам требуется создать неизменяемый список из массива, т. е. нам нужен список, из которого мы можем часто считывать данные, и нам не понадобятся какие-либо операции вставки/удаления в этом списке, то мы можем использовать метод Arrays.asList().
С другой стороны, если нам требуется создать независимый модифицируемый список из массива, из которого мы можем считывать данные, а также изменять список, добавляя/удаляя элементы, то вместо этого мы можем использовать new ArrayList(Array.asList()).
С точки зрения производительности Arrays.asList() работает лучше, чем new ArrayList(Array.asList()). Последний потребляет O(n) временной сложности для создания списка из массива, поскольку он внутренне использует метод System.arrayCopy() для копирования элементов из массива в список.
В то время как Arrays.asList() выполняет операцию со сложностью O(1), поскольку в этом случае не требуется копировать данные из входного массива в список.
4. Преобразование Arrays.asList() в ArrayList
Давайте рассмотрим различные способы преобразования списка, полученного с помощью Arrays.asList(), в новый ArrayList().
4.1 Использование конструктора ArrayList
Мы можем использовать новый конструктор ArrayList() класса ArrayList, чтобы получить независимый объект List.
ArrayList<String> list = new ArrayList<>(Arrays.asList(stringArray));
4.2 Использование традиционного цикла For-Each
Мы можем использовать цикл for-each для итерации по списку, сгенерированному с помощью Arrays.asList(), и добавления каждого элемента в ArrayList.
// Creating list using Arrays.asList() methodList<String> listofStrings = Arrays.asList(stringArray);// Creating ArrayListArrayList<String> list = new ArrayList<>();// Loop over listfor(String str : listofStrings){// Adding str in ArrayListlist.add(str);}// Printing ArrayList referenceSystem.out.println(list); // [a, b, c]// Modifying the created ArrayListlist.add(“d”);list.add(“e”);// Printing ArrayList reference againSystem.out.println(list); // [a, b, c, d, e]
5. Заключение
Мы научились преобразовывать массив в список двумя способами – Arrays.asList() и new ArrayList(Arrays.asList()). Мы также увидели основные различия между ними и то, как они работают внутри, а также практические примеры и варианты использования.