Angenommen, dies arraylist
ist definiert als ArrayList<String> arraylist
, ist arraylist.removeAll(arraylist)
äquivalent zu arraylist.clear()
?
Wenn ja, kann ich davon ausgehen, dass die clear()
Methode zum Leeren der Array-Liste effizienter ist?
Gibt es irgendwelche Einschränkungen bei der Verwendung arraylist.removeAll(arraylist)
anstelle von arraylist.clear()
?
arraylist.removeAll(arraylist)
? Ich sehe absolut keinen Grund dazu.elementData[i] = null
unde.remove()
signifikant?arrList.removeAll(arrList)
stattarrList.clear()
.arrList1.removeAll(arrList2)
ist eine andere Sache.if (c == this && !isEmpty()) { clear(); return true; }
. Ich muss dies als Patch bei OpenJDK einreichen! ;-)Antworten:
Der Quellcode für
clear()
:Der Quellcode für
removeAll()
(wie in definiertAbstractCollection
):clear()
ist viel schneller, da es nicht mit all diesen zusätzlichen Methodenaufrufen umgehen muss.Und wie Atrey betont,
c.contains(..)
erhöht sich die zeitliche Komplexität vonremoveAll
O (n 2 ) im Gegensatz zuclear
O (n).quelle
c.contains(...)
die zeitliche Komplexität der Operation quadriert, würde diese Antwort vervollständigen.AbstractList.Itr.remove()
ArrayList.remove(int)
size = 0; elementData = new Object[10];
der Fall wäre : Der Rest wäre Müll, da das Hintergrundarray keine externen Referenzen enthält.Die zeitliche Komplexität von
ArrayList.clear()
istO(n)
und vonremoveAll
istO(n^2)
.Also ja,
ArrayList.clear
ist viel schneller.quelle
Die
clear()
Methode entfernt alle Elemente einer einzelnenArrayList
. Es ist eine schnelle Operation, da nur die Array-Elemente auf gesetzt werdennull
.Die
removeAll(Collection)
Methode, von der geerbt wirdAbstractCollection
, entfernt alle Elemente in der Argumentauflistung aus der Auflistung, für die Sie die Methode aufrufen. Es ist ein relativ langsamer Vorgang, da eine der beteiligten Sammlungen durchsucht werden muss.quelle
Sofern es keine spezifische Optimierung gibt, die prüft, ob das übergebene Argument
removeAll()
die Sammlung selbst ist (und ich bezweifle sehr , dass eine solche Optimierung vorhanden ist), ist sie erheblich langsamer als eine einfache.clear()
.Abgesehen davon (und mindestens genauso wichtig):
arraylist.removeAll(arraylist)
ist nur stumpfer, verwirrender Code. Es ist eine sehr rückständige Art zu sagen, "diese Sammlung löschen". Welchen Vorteil hätte es gegenüber dem sehr Verständlichenarraylist.clear()
?quelle
Sie dienen verschiedenen Zwecken.
clear()
Löscht eine Instanz der Klasse,removeAll()
entfernt alle angegebenen Objekte und gibt den Status der Operation zurück.quelle
clear()
geht das zugrunde liegende Array durch und setzt jeden Eintrag auf null;removeAll(collection)
Durchläuft die ArrayList und prüftremove(Object)
, ob eine Sammlung vorhanden ist.Ich würde mir vorstellen, dass
clear()
das viel schneller ist als removeAll, weil es nicht vergleichbar ist usw.quelle
Das Löschen ist schneller, da die zu löschenden Elemente nicht durchlaufen werden. Diese Methode kann davon ausgehen, dass ALLE Elemente gelöscht werden können.
Remove all
bedeutet nicht unbedingt, dass alle Elemente in der Liste gelöscht werden, sondern nur die als Parameter angegebenen Elemente sollten gelöscht werden. Daher sind weitere Anstrengungen erforderlich, um diejenigen zu behalten, die nicht gelöscht werden sollten.KLÄRUNG
Mit 'Schleife' meine ich, dass nicht geprüft werden muss, ob das Element beibehalten werden soll oder nicht. Es kann die Referenz auf setzen
null
ohne die bereitgestellten Listen der zu löschenden Elemente zu durchsuchen.Clear
IST schneller alsdeleteall
.quelle
ArrayList.clear()
das auch eine Schleife sein muss.target.removeAll(param)
wird durchlaufenparam
und dann aufrufen,target.contains(...)
was wiederholt wirdtarget
.clear () wird viel effizienter sein. Es wird einfach jeden einzelnen Gegenstand entfernen. Die Verwendung von removeAll (Arraylist) erfordert viel mehr Arbeit, da jedes Element in der Arraylist überprüft wird, um festzustellen, ob es in der Arraylist vorhanden ist, bevor es entfernt wird.
quelle
Array => Sobald der Speicherplatz zur Laufzeit einer Array-Variablen zugewiesen wurde, kann der zugewiesene Speicherplatz nicht erweitert oder entfernt werden.
ArrayList => Dies ist in Arraylist nicht der Fall. ArrayList kann zur Laufzeit wachsen und schrumpfen. Der zugewiesene Speicherplatz kann zur Laufzeit minimiert oder maximiert werden.
quelle