Почему Arrays.asList () возвращает свою собственную реализацию ArrayList

Недавно я узнал, что на Java есть фактически две разные реализации ArrayList (лучше поздно, чем я полагаю …).

Поэтому мне было интересно, почему Arrays.asList(T... a) должен вернуть список, который нельзя изменить? Если им нужен немодифицируемый список, зачем добавить метод set(int index, E element) ?

Поэтому мой общий вопрос: почему бы не вернуть java.util.ArrayList из метода Arrays.asList(T... a) ?

Также, что вы получаете с реализацией java.util.Arrays.ArrayList ?

Ты спрашивал:

Также, что вы получаете с реализацией java.util.Arrays.ArrayList?

Это связано с тем, что ArrayL массивы ArrayList, возвращаемые Arrays.asList, представляют собой просто представление об исходном массиве. Поэтому, когда исходный массив изменен, вид также изменяется.

Если вы будете использовать реальный ArrayList, тогда элементы будут скопированы, а изменение в массиве orignal не повлияет на ArrayList.

Причины этого достаточно просты:

  • производительность: нет необходимости копировать anyting
  • эффективность памяти: нет второго массива

В javadoc говорится, что asList возвращает «список фиксированного размера, поддерживаемый указанным массивом». Если вы хотите resize массива, вам нужно создать новый и скопировать старые данные. Чем список не будет поддерживаться одним и тем же экземпляром массива. Заявленная цель: «Этот метод действует как мост между API-интерфейсами на основе массивов и коллекций». и поэтому запись в базовый массив является требованием к дизайну.

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

Это два разных classа с различным поведением.

Список вернется, когда вы вызвали Arrays.asList – это тонкая shell над массивом, а не копия. Возвращенный список – фиксированный размер: попытка вызвать add будет вызывать исключение UnsupportedOperationException .

С другой стороны, java.util.ArrayList сохраняет свою внутреннюю копию данных и имеет переменный размер.

на самом деле вы можете добавлять элементы в ArrayList с добавлением. метод вроде этого:

 List l2= new ArrayList(Arrays.asList(array1)); l2.add("blueCheese"); 

По-моему, вы используете его, чтобы получить функции списка, но применяя их к массиву.

Два комментария:

1, Попытка сжать возвращаемый массив вызовом метода remove () интерфейса List приведет к исключению UnsupportedOperationException. Это связано с тем, что внутренний class ArrayList внутри classа Arrays расширяет AbstractList, а метод remove () в AbstractList вызывает UnsupportedException.

Таким образом, как только список возвращается, вы можете переустановить существующие элементы EITHER в массиве OR в возвращенном списке, НО вам НЕ разрешено вырастить массив или сжать массив.

  1. В ответ на:

на самом деле вы можете добавлять элементы в ArrayList с добавлением. метод, подобный этому: List l2 = new ArrayList (Arrayys.asList (array1)); l2.add ( “blueCheese”); L2 – независимая копия списка, поэтому List l2 теперь отделен от исходного массива & List. Итак, blueCheese in in l2, но не в исходном массиве / List, которые были скопированы друг от друга.

-dbednar

  • Как читать текстовый файл в список или массив с помощью Python
  • вычисление числа «инверсий» в перестановке
  • Когда функция имеет параметр массива определенного размера, почему она заменяется указателем?
  • Печатать массив без скобок и запятых
  • Лучший способ суммировать значение свойства в массиве
  • указатель на массив c ++
  • Преобразование массива int в массив String
  • Сортировка массива имен папок, таких как Проводник Windows (числовые и по алфавиту) - VB.NET
  • Быстрый способ преобразования двумерного массива в список (одномерный)
  • Java Удалить дубликаты из массива?
  • Как найти индекс элемента в массиве в Java?
  • Interesting Posts

    Зачем использовать Wi-Fi каналы, кроме 1, 6 или 11?

    Вращение нескольких изображений, вызывающих мерцание. Java Graphics2D

    Есть ли недостатки для передачи структур по значению в C, а не для передачи указателя?

    Как добиться динамического controllerа и метода действий в ASP.NET MVC?

    Почему FireFox переносится с двумя Firefox и в чем разница?

    Преобразование FAT32 в NTFS без форматирования (сервер 2008)

    Создание утечки памяти с помощью Java

    Установить цвет заголовка вкладки

    Динамический двумерный массив с указателем на указатель

    Заменить строку в файле с помощью nodejs

    Используйте последнюю версию Internet Explorer в элементе управления webbrowser

    Пакет заменяет определенные строки #s в xml с определенным текстом (строками) из второго файла xml в Windows 7

    Переместить существующую установку Windows 7 или 10 на новый компьютер?

    Как работать на редко используемом жестком диске

    Построение двух переменных в виде строк с использованием ggplot2 на одном графике

    Давайте будем гением компьютера.