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

Arrays.asList() сомнение?

Люди говорят, что метод asList преобразует массив в список и его не копирует, поэтому каждое изменение в 'aList' будет отражено в 'a'. Поэтому добавление новых значений в 'aList' является незаконным, так как массив имеет фиксированный размер.

Но метод asList() возвращает ArrayList<T>. Как компилятор отличает строку 3 от 5. Линия 3 дает мне исключение (UnsupportedOperationException).

        String[] a = {"a","b","c","d"};//1
        List<String> aList =  Arrays.asList(a);//2
        aList.add("e");//3
        List<String> b = new ArrayList<String>();//4
        b.add("a");//5
4b9b3361

Ответ 1

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

Возвращаемым типом Arrays.asList() является java.util.Arrays.ArrayList, который часто путают с java.util.ArrayList. Arrays.ArrayList просто показывает массив как список.

Ответ 2

Прочитать снова, тип файла Arrays.asList:

public static <T> List<T> asList(T... a)

в котором четко указано, что asList возвращает объект, реализующий интерфейс java.util.List, нигде не говорит, что он вернет экземпляр класса java.util.ArrayList.

Затем обратите внимание, что в документации List.add говорится:

boolean add (E e)

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

Технически, каждый раз, когда вы используете переменную, напечатанную как List (вместо ArrayList), вы всегда должны быть осторожны, чтобы этот метод мог бросить UnsupportedOperationException. Если вы уверены, что получите только реализацию List, которая всегда имеет правильную семантику .add(), тогда вы можете опустить проверку под угрозой ошибки, когда ваше предположение недействительно.

Ответ 3

Манож,

Тип возвращаемого файла Arrays.List - это некоторая неизвестная внутренняя реализация интерфейса List и not java.util.ArrayList, поэтому вы можете назначить его только для типа списка.

Если вы назначили его ArrayList, например, он даст вам ошибку времени компиляции "Несоответствие типов: невозможно преобразовать из списка в список массивов"

  ArrayList<String> aList =  Arrays.asList(a);// gives Compile time error

Из Javadoc "Arrays.asList Возвращает список фиксированного размера, поддерживаемый указанным массивом (изменяется на возвращенный список" write through "в массив. )", это означает, что вам предоставляется только представление списка массива, которое создается IMO во время выполнения, и, конечно, вы не можете изменить размер массива, чтобы также не изменять размер "Arrays.asList".

IMO внутренняя реализация Arrays.asList имеет все реализованные методы, которые могут изменять размер массива как -

void add(E e)
{
//some unknown code
throw(java.lang.UnsupportedOperationException);
}

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

Тем не менее, если вы хотите добавить некоторые новые элементы в ArrayList с помощью такого синтаксиса, вы можете сделать это, создав подкласс Arraylist (желательно с использованием анонимного подкласса ArrayList). Вы можете передать возвращаемый тип Arrays.List в конструктор ArrayList (т.е. Public ArrayList (Collection c)) что-то вроде этого -

List<String> girlFriends = new java.util.ArrayList<String>(Arrays.asList("Rose", "Leena", "Kim", "Tina"));
girlFriends.add("Sarah");

Теперь вы можете легко добавить Сару в свой список GF, используя тот же синтаксис.

PS - Выберите этот тот или иной вариант в качестве ответа, потому что все объяснено. Ваша низкая скорость приема очень обескураживает.

Ответ 4

asList() не возвращает java.util.ArrayList, он возвращает java.util.Arrays$ArrayList. Этот класс даже не расширяет java.util.ArrayList, поэтому его поведение может быть (и есть) совершенно другим.

Метод add() наследуется от java.util.AbstractList, который по умолчанию просто бросает UnsupportedOperationException.

Ответ 5

Это исключение, а не ошибка компилятора. Он запускается, когда программа запускается, а не во время компиляции. В принципе, фактический класс, возвращаемый Arrays.asList, имеет throw UnsupporteOperationException внутри метода add().

Более конкретно Arrays.asList вернет внутренний класс, определенный внутри класса Arrays, который получен из AbstractList и не реализует метод add. Метод add из AbstractList фактически выбрасывает исключение.

Ответ 6

Вы предполагаете, что Arrays.asList() возвращает ArrayList, но это не так. Arrays.asList() возвращает неуказанную реализацию List. Эта реализация просто бросает UnsupportedOperationException для каждого неподдерживаемого метода.

Ответ 7

Ключом к этому является реализация List, возвращенная

List<String> aList =  Arrays.asList(a);

Если вы посмотрите на исходный код в Arrays, вы увидите, что он содержит внутренний закрытый статический класс ArrayList. Это не то же самое, что java.util.ArrayList.

Ответ 8

asList возвращает список фиксированного размера, так что вы не можете добавлять к нему новые элементы. Поскольку список, который он возвращает, действительно является "представлением" массива, из которого он был создан ( "a" в вашем случае), имеет смысл, что вы не сможете добавлять элементы - так же, как вы не можете добавлять элементы в массив. См. Документы для asList