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 .