Ich habe eine Sammlung c1<MyClass>
und ein Array a<MyClass>
. Ich versuche, das Array in eine Sammlung zu konvertieren c2
und zu tun c1.removeAll(c2)
, aber das wirft UnsupportedOperationException
. Ich fand heraus, dass die asList()
of Arrays-Klasse eine Klasse zurückgibt Arrays.ArrayList
und diese Klasse die Klasse erbt, removeAll()
von AbstractList()
deren Implementierung ausgelöst wird UnsupportedOperationException
.
Myclass la[] = getMyClass();
Collection c = Arrays.asList(la);
c.removeAll(thisAllreadyExistingMyClass);
Gibt es eine Möglichkeit, die Elemente zu entfernen? Bitte helfen Sie
Antworten:
Arrays.asList
Gibt einenList
Wrapper um ein Array zurück. Dieser Wrapper hat eine feste Größe und wird direkt vom Array unterstützt. Durch Aufrufe vonset
wird das Array geändert, und jede andere Methode, die die Liste ändert, löst eine ausUnsupportedOperationException
.Um dies zu beheben, müssen Sie eine neue änderbare Liste erstellen, indem Sie den Inhalt der Wrapper-Liste kopieren. Dies ist einfach, indem Sie den
ArrayList
Konstruktor verwenden, der Folgendes verwendetCollection
:quelle
java.util.Arrays
asList()
Methode angesehen und er scheint eine zurückzugebenArrayList
. Wenn ich jedoch eine macheSystem.out.println(list.getClass());
, bekomme ichclass java.util.Arrays$ArrayList
. Es wird also die innereArrayList
Klasse verwendet, die keineadd
oder-remove
Methode hat. Ich frage mich nur, was es bringt, eine innereArrayList
Klasse zu haben, anstatt diejava.util.ArrayList
eine zu verwenden, und warum nicht eineadd()
und-remove()
Methode?add
undremove
Methodejava.util.ArrayList
. Sie möchten, dass eine ImplementierungList
eine Ausnahme auslöst, wenn Sie damit etwas Illegales tun (z. B. Hinzufügen oder Entfernen), undArrayList
diese Anforderung nicht erfüllt.Arrays.asList
erstellt nur einen WrapperList
. Aber es ist immer noch einejava.util.List
, also muss es diese Methoden haben. Sie können jedoch nicht angewendet werden, da dies zur Erstellung eines neuen Arrays mit unterschiedlicher Größe führen würde. Dies ist nicht möglich, da die Änderungen, die Sie noch vornehmen können, sowohl über die zurückgegebene Liste als auch über das ursprüngliche Array vorgenommen werden können. Dies ist nicht möglich, wenn sich die zurückgegebene Liste so ändern könnte, dass die ursprüngliche Array-Referenz im Grunde genommen weggeworfen wird.Ja, die
Arrays.asList(..)
is-Sammlung kann nicht erweitert oder verkleinert werden (da sie vom ursprünglichen Array unterstützt wird und die Größe nicht geändert werden kann).Wenn Sie Elemente entfernen möchten, erstellen Sie entweder ein
new ArrayList(Arrays.asList(..)
Element oder entfernen Sie es direkt aus dem Array (dies ist weniger effizient und schwieriger zu schreiben).quelle
Das
Array.asList()
funktioniert so, weil es direkt vom Array unterstützt wird. Um eine vollständig änderbare Liste zu erhalten, müssten Sie die Sammlung in eine von Ihnen selbst erstellte Sammlung klonen.quelle
ArrayList
. Der Unterschied war vielleicht nicht allzu klar. :-) Ob die Liste modifizierbar ist oder nicht, ist eine Frage der Definition, sie ist "semi-modifizierbar", aber meiner Ansicht nach nicht vollständig modifizierbar.