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

JaredPar уже указал Process класс, таким образом, я просто добавлю, что необходимо знать, что класс берет снимок информации процесса, когда экземпляр создается. Это не предпросмотр в реальном времени. Для обновления его, необходимо звонить Refresh() на экземпляре.

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

И наконец если Вы звоните Process.GetProcesses(), Вы также получите псевдо "неактивные" процессы и "система". IIRC у них есть определенные идентификаторы процесса, таким образом, можно легко фильтровать их.

41
задан Vasily Kabunov 8 March 2017 в 08:49
поделиться

5 ответов

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

В документах это не так ясно, как могло бы быть, но они поддерживают :

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

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

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

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

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

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

63
ответ дан 27 November 2019 в 00:22
поделиться

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

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

6
ответ дан 27 November 2019 в 00:22
поделиться

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

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

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

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

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

23
ответ дан 27 November 2019 в 00:22
поделиться

Прочтите документацию API для Arrays.asList () :

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

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

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

7
ответ дан 27 November 2019 в 00:22
поделиться

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

List newList = new ArrayList(myList);
0
ответ дан 27 November 2019 в 00:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: