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 .