Почему Arrays.asList () возвращает свою собственную реализацию ArrayList - PullRequest
41 голосов
/ 11 января 2011

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

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

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

Кроме того, что вы получаете с реализацией java.util.Arrays.ArrayList?

Ответы [ 6 ]

49 голосов
/ 11 января 2011

Вы спросили:

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

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

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

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

  • производительность: нет необходимости копировать что-либо
  • эффективная память: второй массив не требуется
13 голосов
/ 11 января 2011

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

6 голосов
/ 11 января 2011

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

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

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

5 голосов
/ 11 января 2011

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

3 голосов
/ 12 апреля 2013

На самом деле вы можете добавлять элементы в ArrayList с помощью add.метод, подобный этому:

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

По моему мнению, вы используете его для получения функций Списка, но применяете их к Массиву.

1 голос
/ 20 июня 2013

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

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

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

  1. В ответ на:

    на самом деле вы можете добавлять элементы в ArrayList с помощью add. метод как это: List l2 = new ArrayList (Arrays.asList (array1)); l2.add ( "blueCheese");

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

-dbednar

...