Java Arrays.asList() против нового ArrayList()

Узнайте, как создать список из массива с помощью 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.

Java Arrays.asList() против нового ArrayList()0

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

Java Arrays.asList() против нового ArrayList()1
Java Arrays.asList() против нового ArrayList()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()). Мы также увидели основные различия между ними и то, как они работают внутри, а также практические примеры и варианты использования.

Прокрутить вверх