3598 Stimmen

Wann sollte man LinkedList statt ArrayList in Java verwenden?

Ich war schon immer jemand, der einfach nur benutzt:

List<String> names = new ArrayList<>();

Ich verwende die Schnittstelle als Typname für Tragbarkeit damit ich, wenn ich Fragen wie diese stelle, meinen Code überarbeiten kann.

Wann sollte LinkedList verwendet werden über ArrayList und andersherum?

10 Stimmen

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.

-2voto

Ilya Gazman Punkte 29734

Wann sollte ich die LinkedList ? Vor allem bei der Arbeit mit Stapeln oder bei der Arbeit mit Puffern. Wann sollte ich verwenden ArrayList ? Nur bei der Arbeit mit Indizes, sonst können Sie HashTable mit verknüpften Liste verwenden, dann erhalten Sie:

Hash-Tabelle + verknüpfte Liste

  • Zugang mit Schlüssel O(1),
  • Einfügen nach Taste O(1),
  • Entfernen nach Taste O(1)
  • und es gibt einen Trick, um RemoveAll / SetAll mit O(1) zu implementieren, wenn man Versionierung verwendet

Es scheint eine gute Lösung zu sein, und in den meisten Fällen ist es das auch, aber Sie sollten wissen: HashTable braucht viel Speicherplatz, und wenn Sie eine Liste mit 1.000.000 Elementen verwalten müssen, kann das zu einem Problem werden. Dies kann bei Serverimplementierungen vorkommen, bei Clients ist es selten der Fall.

Werfen Sie auch einen Blick auf Rot-Schwarz-Baum

  • Zufälliger Zugriff Log(n),
  • einfügen. Log(n),
  • entfernen Log(n)

4 Stimmen

Ich wünschte, ich könnte dem Ganzen mehr als eine 1 geben: LinkedList ergibt O(N) für alle Einfüge-, Entfernungs- und Zufallszugriffe, da man die Liste zuerst durchlaufen muss, um an den richtigen Punkt zu gelangen. Auch könnte es Sie überraschen zu erfahren, dass hashmap / Tabelle verwenden Größenänderung Arrays genau wie ArrayList und angesichts der Tatsache, dass die häufigste Verwendung von Listen ist nur durch eine Zahl indiziert werden, mit einer von denen über eine ArrayList ist die schlechteste Idee.

1 Stimmen

@Numeron Sie haben recht, es war nicht klar, was ich geantwortet habe. In der Tat, wenn Sie versuchen, auf eine verknüpfte Liste nach Index zuzugreifen, wird es O(n) sein, aber ich meinte das Einfügen in eine verknüpfte Liste nach Elementen. Dann ist es O(1) und auch die Interaktion über alle Listen ist dasselbe wie bei Array-Listen.

-10voto

Boris Fain Punkte 3

Verwenden Sie zunächst Vector statt ArrayList, da Sie die Methode insureCapasity überschreiben können, in ArrayList ist privat und fügen Sie 1,5 Größe des aktuellen Arrays https://docs.oracle.com/javase/8/docs/api/java/util/Vector.html#ensureCapacity-int-

in vielen Fällen kann es besser sein, dass linkedList, die las hat großen Vorteil ein Sie Daten mit hoher Frequenz einfügen, so dass die Größe der Liste ändert sich sehr schnell und Sie können nicht Größe für Anzahl Elemente zuweisen. In der Theorie können Sie Fehler wie nicht "genug Speicher" erhalten, aber in modernen Computern haben Sie 16G und Swaping-Disk, so dass, wenn Sie Liste ist billoins Elemente können Sie scheitern, im Vergleich 15-20 Jahren vor.

2 Stimmen

Vector ist langsamer im Vergleich zu ArrayList denn Vector ist thread-sicher. Die beste Praxis ist die Verwendung einer Vector es sei denn, die Fadensicherheit ist erforderlich. Vector verdoppelt standardmäßig seine Größe, ArrayList vervielfacht seine Größe um 3/2. Siehe: stackoverflow.com/questions/17471913/

1 Stimmen

Was soll das heißen? ArrayList hat eine öffentliche ensureCapacity Methode und immer schon hatte. Ihr einziger Grund, eine veraltete Klasse zu verwenden, hält also keinem einzigen Realitätscheck stand.

0 Stimmen

Aus der Vector.java-Dokumentation über Ihren eigenen Link: "Im Gegensatz zu den neuen Sammlungsimplementierungen ist Vector synchronisiert. Wenn eine thread-sichere Implementierung nicht benötigt wird, wird empfohlen, ArrayList anstelle von Vector zu verwenden."

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X