Перейти к основному содержимому

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

· 3 мин. чтения

1. Обзор

В этом кратком руководстве мы рассмотрим различия между Arrays.asList(массив) и ArrayList(Arrays.asList(массив)).

2. Массивы.как список

Начнем с метода Arrays.asList .

Используя этот метод, мы можем преобразовать массив в объект List фиксированного размера . Этот список является просто оболочкой, которая делает массив доступным в виде списка. Никакие данные не копируются и не создаются .

Кроме того, мы не можем изменить его длину, потому что добавление или удаление элементов запрещено .

Однако мы можем изменять отдельные элементы внутри массива. Обратите внимание, что все изменения, которые мы вносим в отдельные элементы списка , будут отражены в нашем исходном массиве :

String[] stringArray = new String[] { "A", "B", "C", "D" };
List stringList = Arrays.asList(stringArray);

Теперь давайте посмотрим, что произойдет, если мы изменим первый элемент stringList :

stringList.set(0, "E");

assertThat(stringList).containsExactly("E", "B", "C", "D");
assertThat(stringArray).containsExactly("E", "B", "C", "D");

Как мы видим, наш исходный массив тоже был изменен. И список, и массив теперь содержат одни и те же элементы в одном и том же порядке.

Давайте теперь попробуем вставить новый элемент в stringList :

stringList.add("F");
java.lang.UnsupportedOperationException
at java.base/java.util.AbstractList.add(AbstractList.java:153)
at java.base/java.util.AbstractList.add(AbstractList.java:111)

Как мы видим, добавление/удаление элементов в/из списка вызовет исключение java.lang.UnsupportedOperationException .

3. ArrayList(Arrays.asList(массив))

Подобно методу Arrays.asList , мы можем использовать ArrayList<>(Arrays.asList(array)) когда нам нужно создать список из массива .

Но, в отличие от нашего предыдущего примера, это независимая копия массива, а это означает, что изменение нового списка не повлияет на исходный массив . Кроме того, у нас есть все возможности обычного ArrayList, такие как добавление и удаление элементов:

String[] stringArray = new String[] { "A", "B", "C", "D" }; 
List stringList = new ArrayList<>(Arrays.asList(stringArray));

Теперь давайте изменим первый элемент stringList :

stringList.set(0, "E");

assertThat(stringList).containsExactly("E", "B", "C", "D");

А теперь давайте посмотрим, что произошло с нашим исходным массивом:

assertThat(stringArray).containsExactly("A", "B", "C", "D");

Как мы видим, наш исходный массив остался нетронутым .

Прежде чем завершить, если мы посмотрим на исходный код JDK , мы увидим, что метод Arrays.asList возвращает тип ArrayList , отличный от java.util.ArrayList . Основное отличие состоит в том, что возвращенный ArrayList только обертывает существующий массив — он не реализует методы добавления и удаления .

4. Вывод

В этой короткой статье мы рассмотрели различия между двумя способами преобразования массива в ArrayList . Мы увидели, как ведут себя эти две опции, и разницу между тем, как они реализуют свои внутренние массивы.

Как всегда, образцы кода можно найти на GitHub .