Vergleichen wir LinkedList und ArrayList mit den folgenden Parametern:
1. Umsetzung
ArrayList ist die Implementierung der Schnittstelle list für größenveränderliche Arrays, während
LinkedList ist die Implementierung der Listenschnittstelle in Form einer doppelt verketteten Liste.
2. Leistung
-
get(int index) oder Suchvorgang
ArrayList Die Operation get(int index) läuft in konstanter Zeit, d. h. O(1), während
LinkedList Die Laufzeit der Operation get(int index) beträgt O(n) .
Der Grund dafür ArrayList schneller als LinkedList ist, dass ArrayList ein indexbasiertes System für seine Elemente verwendet, da es intern eine Array-Datenstruktur verwendet,
LinkedList bietet keinen indexbasierten Zugriff auf seine Elemente, da es entweder vom Anfang oder vom Ende aus (je nachdem, was näher liegt) durchläuft, um den Knoten am angegebenen Elementindex zu finden.
-
insert() oder add(Object) Operation
Einfügungen in LinkedList sind im Allgemeinen schnell im Vergleich zu ArrayList. In LinkedList ist das Hinzufügen oder Einfügen eine O(1) Operation.
Während in ArrayList Wenn das Array voll ist, d.h. im schlimmsten Fall, fallen zusätzliche Kosten für die Größenänderung des Arrays und das Kopieren von Elementen in das neue Array an, wodurch die Laufzeit der Hinzufügungsoperation in ArrayList O(n) beträgt, andernfalls ist sie O(1).
-
remove(int) Vorgang
Der Löschvorgang in LinkedList ist im Allgemeinen derselbe wie in ArrayList, d.h. O(n).
Unter LinkedList Es gibt zwei überladene remove-Methoden. Eine ist remove() ohne Parameter, die den Kopf der Liste entfernt und in konstanter Zeit O(1) läuft. Die andere überladene remove-Methode in LinkedList ist remove(int) oder remove(Object), die das als Parameter übergebene Object oder int entfernt. Diese Methode durchläuft die LinkedList, bis sie das Objekt gefunden hat, und löst es aus der ursprünglichen Liste. Daher ist die Laufzeit dieser Methode O(n).
Während in ArrayList remove(int)-Methode beinhaltet das Kopieren von Elementen aus dem alten Array in das neue, aktualisierte Array, daher ist ihre Laufzeit O(n).
3. Umgekehrter Iterator
LinkedList kann in umgekehrter Richtung mit descendingIterator() iteriert werden, während
es gibt keinen descendingIterator() in ArrayList Daher müssen wir unseren eigenen Code schreiben, um die ArrayList in umgekehrter Richtung zu durchlaufen.
4. Ursprüngliche Kapazität
Wenn der Konstruktor nicht überladen ist, dann ArrayList erzeugt eine leere Liste mit der Anfangskapazität 10, während
LinkedList konstruiert nur die leere Liste ohne Anfangskapazität.
5. Speicher-Overhead
Speicher-Overhead in LinkedList ist im Vergleich zu ArrayList größer, da ein Knoten in LinkedList die Adressen des nächsten und des vorherigen Knotens behalten muss. Während
Unter ArrayList jeder Index enthält nur das eigentliche Objekt (Daten).
Quelle
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
).