UnsupportedOperationException при попытке удалить из списка, возвращенного Array.asList - PullRequest
40 голосов
/ 26 октября 2009

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

Ответы [ 6 ]

61 голосов
/ 26 октября 2009

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

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

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

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

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

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

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

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

23 голосов
/ 26 октября 2009

Это не java.util.ArrayList. Arrays.asList() возвращает собственную реализацию List (с изменениями, "записанными" в массив.).

Это список фиксированного размера , поэтому он не поддерживает удаление.

Вы можете создать настоящий ArrayList из него:

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

Это очень запутанно, как работает asList(), должен признать.

7 голосов
/ 26 октября 2009

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

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

Обратите внимание, что Collections.remove (int) помечен в Javadocs как «необязательная операция», то есть не все Коллекции будут поддерживать его. «список с фиксированным размером» означает, что вы не можете изменить размер списка, что делает remove (). Так что это не поддерживается.

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

6 голосов
/ 26 октября 2009

Реализация, которую вы получаете от asList, не реализует полный интерфейс List. Я бы преобразовал список в ArrayList и затем сделал бы изменения в нем.

См. http://java.sun.com/j2se/1.4.2/docs/api/java/util/List.html#remove%28int%29

0 голосов
/ 20 августа 2017

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

ArrayList вместо List

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

0 голосов
/ 26 октября 2009

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

List newList = new ArrayList(myList);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...