У меня есть коллекция c1<MyClass>
и массив a<MyClass>
. Я пытаюсь преобразовать массив в коллекцию c2
и делаю это c1.removeAll(c2)
, но это бросает UnsupportedOperationException
. Я обнаружил , что asList()
из Массивы возвращает класс Arrays.ArrayList
класса и этот класса наследует removeAll()
от AbstractList()
которого реализации бросков UnsupportedOperationException
.
Myclass la[] = getMyClass();
Collection c = Arrays.asList(la);
c.removeAll(thisAllreadyExistingMyClass);
Есть ли способ удалить элементы? пожалуйста помоги
Ответы:
Arrays.asList
возвращаетList
оболочку вокруг массива. Эта оболочка имеет фиксированный размер и напрямую поддерживается массивом, поэтому вызовы toset
будут изменять массив, а любой другой метод, изменяющий список, будет генерировать файлUnsupportedOperationException
.Чтобы исправить это, вы должны создать новый изменяемый список, скопировав содержимое списка оболочки. Это легко сделать, используя
ArrayList
конструктор, который принимаетCollection
:Collection c = new ArrayList(Arrays.asList(la));
источник
java.util.Arrays
asList()
метода, и, похоже, он возвращаетArrayList
. Однако когда я делаю этоSystem.out.println(list.getClass());
, я получаюclass java.util.Arrays$ArrayList
. Таким образом, он использует внутреннийArrayList
класс, у которого нет методаadd
илиremove
. Мне просто интересно, какой смысл иметь внутреннийArrayList
класс вместо того, чтобы использовать его,java.util.ArrayList
и почему бы не иметь методadd()
andremove()
?add
иremove
методjava.util.ArrayList
. Вам нужна реализация,List
которая генерирует исключение, если вы делаете с ним что-то незаконное (например, добавляете или удаляете), иArrayList
не удовлетворяет этому требованию.Arrays.asList
просто создает оболочкуList
. Но это по-прежнему ajava.util.List
, поэтому у него должны быть эти методы. Но их нельзя применить, потому что это приведет к созданию нового массива с другим размером. Что невозможно сделать, потому что изменения, которые вы все еще можете сделать, можно выполнить как через возвращенный список, так и через исходный массив. Это было бы невозможно, если бы возвращенный список мог измениться так, чтобы он в основном отбрасывал исходную ссылку на массив.Ага,
Arrays.asList(..)
это коллекция, которую нельзя расширить или сжать (потому что она поддерживается исходным массивом, и ее размер нельзя изменить).Если вы хотите удалить элементы, либо создайте,
new ArrayList(Arrays.asList(..)
либо удалите элементы непосредственно из массива (это будет менее эффективно и сложнее для записи)источник
Этот способ
Array.asList()
работает, потому что он напрямую поддерживается массивом. Чтобы получить полностью изменяемый список, вам нужно будет клонировать коллекцию в коллекцию, созданную вами.Collection c = new ArrayList(Arrays.asList(la))
источник
ArrayList
. Хотя, возможно, разница была не слишком очевидной. :-) Является ли список изменяемым или нет - это вопрос определения, он "полумодифицируемый", но не полностью изменяемый, на мой взгляд.