両方 remove()
y insert()
haben eine Laufzeiteffizienz von O(n) sowohl für ArrayLists als auch für LinkedLists. Der Grund für die lineare Verarbeitungszeit liegt jedoch in zwei sehr unterschiedlichen Gründen:
In einer ArrayList erreicht man das Element in O(1), aber wenn man etwas entfernt oder einfügt, ist es O(n), weil alle folgenden Elemente geändert werden müssen.
In einer LinkedList dauert es O(n), um zum gewünschten Element zu gelangen, da wir ganz am Anfang beginnen müssen, bis wir den gewünschten Index erreichen. Das tatsächliche Entfernen oder Einfügen ist konstant, da wir nur 1 Verweis ändern müssen für remove()
und 2 Referenzen für insert()
.
Welches der beiden Verfahren schneller ist, hängt davon ab, wo das Einsetzen und Herausnehmen geschieht. Wenn wir uns näher am Anfang befinden, ist die LinkedList schneller, weil wir relativ wenige Elemente durchgehen müssen. Wenn wir uns näher am Ende befinden, ist eine ArrayList schneller, weil wir in konstanter Zeit dorthin gelangen und nur die wenigen verbleibenden Elemente ändern müssen, die ihr folgen. Wenn wir uns genau in der Mitte befinden, ist die LinkedList schneller, weil das Durchgehen von n Elementen schneller ist als das Verschieben von n Werten.
Bonus: Während es keine Möglichkeit gibt, diese beiden Methoden für eine ArrayList zu O(1) zu machen, gibt es tatsächlich eine Möglichkeit, dies in LinkedLists zu tun. Nehmen wir an, wir wollen die gesamte Liste durchgehen und dabei Elemente entfernen und einfügen. Normalerweise würde man mit der LinkedList für jedes Element ganz von vorne beginnen, wir könnten aber auch das aktuelle Element, an dem wir arbeiten, mit einem Iterator "speichern". Mit Hilfe des Iterators erhalten wir eine O(1)-Effizienz für remove()
y insert()
bei der Arbeit in einer LinkedList. Das ist der einzige Leistungsvorteil, der mir bekannt ist, bei dem eine LinkedList immer besser ist als eine ArrayList.
10 Stimmen
Siehe auch: Array versus verknüpfte Liste
12 Stimmen
Siehe dazu das Zitat des Autors von LinkedList stackoverflow.com/a/42529652/2032701 und Sie bekommen ein praktisches Gefühl für das Thema.
2 Stimmen
Niemals. Ich habe es einmal in meinen 25 Jahren Java-Programmierung getan und es im Nachhinein bereut.
0 Stimmen
Bjarne Stroustrup hat dies auch ausgiebig für C++ diskutiert
std::vector
(wie JavaArrayList
) undstd::list
(wie JavaLinkedList
).