Подтвердить что ты не робот

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

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

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

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

И что вы получаете с помощью реализации java.util.Arrays.ArrayList?

4b9b3361

Ответ 1

Вы спросили:

И что вы получаете с помощью java.util.Arrays.ArrayList реализация?

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

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

Причины для этого довольно просты:

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

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

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

Ответ 6

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

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

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

  • В ответ на:

    на самом деле вы можете добавлять элементы в ArrayList с добавлением. метод вроде этого: Список l2 = новый ArrayList (Arrayys.asList(массив1)); l2.add( "blueCheese" );

L2 является независимой копией списка, поэтому List l2 теперь отделен от исходного массива & List. Итак, blueCheese in in l2, но не в исходном массиве /List, которые были скопированы друг от друга.

-dbednar