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

UnsupportedOperationException при попытке удалить из списка, возвращаемого Array.asList

Я использую List для хранения некоторых данных, полученных вызовом метода Array.asList(). Затем я пытаюсь удалить элемент с помощью метода myList.Remove(int i). Но пока я пытаюсь сделать это, я получаю UnsupportedOperationException. В чем причина этого? Как решить эту проблему?

4b9b3361

Ответ 1

Array.asList() обертывает массив в интерфейсе списка. Список по-прежнему поддерживается массивом. Массивы представляют собой фиксированный размер - они не поддерживают добавление или удаление элементов, поэтому оболочка также не может.

Документы не делают это так ясно, как могут, но они говорят:

Возвращает список фиксированного размера, поддерживаемый указанным массивом.

Бит фиксированного размера должен быть подсказкой, что вы не можете добавлять или удалять элементы:)

Хотя есть другие способы обойти это (другие способы создания нового ArrayList из массива) без дополнительных библиотек, я лично рекомендовал бы получить Библиотека коллекций Google (или Guava, когда она была выпущена). Затем вы можете использовать:

List<Integer> list = Lists.newArrayList(array);

Причина, по которой я предлагаю это, состоит в том, что GCL - это вообще хорошая вещь, и ее стоит использовать.

Как отмечено в комментариях, это берет копию массива; список не поддерживается исходным массивом, и изменения в любой коллекции не будут отображаться в другом.

Ответ 2

Это не java.util.ArrayList. Arrays.asList() возвращает свою собственную реализацию List и не поддерживает удаление. Вы можете создать из него реальный ArrayList:

new java.util.ArrayList(Arrays.asList(someArray));  

Очень сложно понять, как работает asList().

Ответ 3

Пожалуйста, прочитайте документы API для Arrays.asList():

Возвращает список фиксированного размера, поддерживаемый указанным массивом. (Изменения в возвращенном списке "записывать" в массив.)

Обратите внимание, что Collections.remove(int) помечен в Javadocs как "необязательная операция", то есть не все коллекции будут его поддерживать. "Список фиксированных размеров" означает, что вы не можете изменить размер списка, который будет выполнять remove(). Поэтому он не поддерживается.

Если вы хотите изменить список, сгенерированный Arrays.asList(), просто скопируйте его, например. new ArrayList(Arrays.asList(...)).

Ответ 5

Потому что вы получаете список только для чтения. попробуйте

List newList = new ArrayList(myList);

Ответ 6

использование

ArrayList вместо списка

Список имеет элемент фиксированного размера, List не может ни добавить элемент, ни удалить элемент