1) Zugrunde liegende Datenstruktur
Der erste Unterschied zwischen ArrayList und LinkedList liegt in der Tatsache, dass ArrayList durch Array unterstützt wird, während LinkedList durch LinkedList unterstützt wird. Dies wird zu weiteren Unterschieden in der Leistung führen.
2) LinkedList implementiert Deque
Ein weiterer Unterschied zwischen ArrayList und LinkedList ist, dass LinkedList neben der List-Schnittstelle auch die Deque-Schnittstelle implementiert, die First-in-First-out-Operationen für add()
y poll()
und mehrere andere Deque-Funktionen. 3) Hinzufügen von Elementen in ArrayList Das Hinzufügen eines Elements in ArrayList ist eine O(1)-Operation, wenn es keine Größenänderung des Arrays auslöst, in diesem Fall wird es zu O(log(n)), Andererseits ist das Hinzufügen eines Elements in LinkedList eine O(1)-Operation, da es keine Navigation erfordert.
4) Ein Element aus einer Position entfernen
Um ein Element aus einem bestimmten Index zu entfernen, z. B. durch Aufruf von remove(index)
ArrayList führt einen Kopiervorgang durch, wodurch es fast O(n) wird, während LinkedList zu diesem Punkt durchlaufen muss, wodurch es ebenfalls O(n/2) wird, da es je nach Nähe von beiden Richtungen aus durchlaufen kann.
5) Iteration über ArrayList oder LinkedList
Iteration ist die O(n)-Operation sowohl für LinkedList als auch für ArrayList, wobei n die Nummer eines Elements ist.
6) Abrufen von Elementen aus einer Position
El get(index)
Operation ist O(1) in ArrayList, während sie O(n/2) in LinkedList ist, da sie bis zu diesem Eintrag durchlaufen werden muss. In der Big-O-Notation ist O(n/2) jedoch einfach O(n), da wir dort Konstanten ignorieren.
7) Speicher
LinkedList verwendet ein Wrapper-Objekt, Entry, das eine statische verschachtelte Klasse zum Speichern von Daten und zwei Knoten next und previous ist, während ArrayList nur Daten in Array speichert.
Der Speicherbedarf scheint also bei ArrayList geringer zu sein als bei LinkedList, außer in dem Fall, in dem Array die Größenänderung durchführt, wenn es den Inhalt von einem Array in ein anderes kopiert.
Wenn das Array groß genug ist, kann es zu diesem Zeitpunkt viel Speicherplatz beanspruchen und die Garbage Collection auslösen, was die Antwortzeit verlangsamen kann.
Aus all den oben genannten Unterschieden zwischen ArrayList und LinkedList sieht es so aus, als ob ArrayList in fast allen Fällen die bessere Wahl ist als LinkedList, außer wenn man eine häufige add()
Betrieb als remove()
, oder get()
.
Es ist einfacher, eine verknüpfte Liste als ArrayList zu ändern, insbesondere wenn Sie Elemente am Anfang oder Ende hinzufügen oder entfernen, da die verknüpfte Liste intern Referenzen auf diese Positionen behält und sie in O(1) Zeit zugänglich sind.
Mit anderen Worten: Sie müssen die verknüpfte Liste nicht durchlaufen, um zu der Position zu gelangen, an der Sie Elemente hinzufügen möchten; in diesem Fall wird die Addition zu einer O(n)-Operation. Zum Beispiel das Einfügen oder Löschen eines Elements in der Mitte einer verknüpften Liste.
Meiner Meinung nach, verwenden ArrayList über LinkedList für die meisten der praktischen Zweck in Java.
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
).