Рубрики
Без рубрики

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

Они могут выглядеть очень похожи, но это не так. Давайте рассмотрим, почему.

Автор оригинала: baeldung.

1. Обзор

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

2. Arrays.asList

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

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

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

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

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

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

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

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

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

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 (array))

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

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

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

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

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 .