Remove() в списке, созданном с помощью Arrays.asList() throws UnsupportedOperationException
У меня есть коллекция c1<MyClass>
и массив a<MyClass>
. Я пытаюсь преобразовать массив в коллекцию c2
и сделать c1.removeAll(c2)
, но это вызывает UnsupportedOperationException
. Я обнаружил, что класс asList()
класса Arrays возвращает класс Arrays.ArrayList
, и этот класс наследует removeAll()
из AbstractList()
, реализация которого бросает UnsupportedOperationException
.
Myclass la[] = getMyClass();
Collection c = Arrays.asList(la);
c.removeAll(thisAllreadyExistingMyClass);
Есть ли способ удалить элементы? пожалуйста, помогите
Ответы
Ответ 1
Arrays.asList
возвращает обертку List
вокруг массива. Эта оболочка имеет фиксированный размер и напрямую поддерживается массивом, и поэтому вызовы set
будут изменять массив, а любой другой метод, который изменяет список, выдает UnsupportedOperationException
.
Чтобы исправить это, вам необходимо создать новый изменяемый список, скопировав содержимое списка обертки. Это легко сделать с помощью конструктора ArrayList
, который принимает Collection
:
Collection c = new ArrayList(Arrays.asList(la));
Ответ 2
Yup, Arrays.asList(..)
- это коллекция, которая не может быть расширена или сжата (поскольку она поддерживается исходным массивом и ее нельзя изменить).
Если вы хотите удалить элементы, создайте new ArrayList(Arrays.asList(..)
или удалите элементы непосредственно из массива (это будет менее эффективно и сложнее для записи)
Ответ 3
Так работает Array.asList()
, потому что он напрямую поддерживается массивом.
Чтобы получить полностью изменяемый список, вам придется клонировать коллекцию в созданную вами коллекцию.
Collection c = new ArrayList(Arrays.asList(la))
Ответ 4
Чтобы исправить эту ошибку, вы также можете попробовать this.I надеюсь, что это полезно
List<ChunkId> idList = new ArrayList<>();
idList.addAll(Arrays.asList(ids.toArray(new ChunkId[0])));