Eine Anleitung zur Java LinkedList

1. Einleitung

LinkedList ist eine doppelt verknüpfte Liste Umsetzung der Liste und Deque - Schnittstellen. Es implementiert alle optionalen Listenoperationen und erlaubt alle Elemente (einschließlich Null ).

2. Funktionen

Nachfolgend finden Sie die wichtigsten Eigenschaften der LinkedList :

  • Operationen, die in die Liste indizieren, durchlaufen die Liste vom Anfang oder vom Ende, je nachdem, welcher Wert näher am angegebenen Index liegt
  • Es ist nicht synchronisiert
  • Die Iteratoren Iterator und ListIterator sind ausfallsicher (was bedeutet, dass nach der Erstellung des Iterators eine ConcurrentModificationException ausgelöst wird , wenn die Liste geändert wird).
  • Jedes Element ist ein Knoten, der einen Verweis auf den nächsten und den vorherigen enthält
  • Die Einfügereihenfolge wird beibehalten

Obwohl LinkedList nicht synchronisiert ist, können wir eine synchronisierte Version davon abrufen, indem wir die Collections.synchronizedList- Methode aufrufen , wie z.

List list = Collections.synchronizedList(new LinkedList(...));

3. Vergleich mit ArrayList

Obwohl beide die List- Schnittstelle implementieren , haben sie unterschiedliche Semantiken - was sich definitiv auf die Entscheidung auswirkt, welche verwendet werden soll.

3.1. Struktur

Eine ArrayList ist eine indexbasierte Datenstruktur, die von einem Array unterstützt wird . Es bietet zufälligen Zugriff auf seine Elemente mit einer Leistung von O (1).

Andererseits speichert eine LinkedList ihre Daten als Liste von Elementen und jedes Element ist mit seinem vorherigen und nächsten Element verknüpft. In diesem Fall hat die Suchoperation für ein Element eine Ausführungszeit von O (n).

3.2. Operationen

Das Einfügen, Hinzufügen und Entfernen eines Elements in einer LinkedList ist schneller, da die Größe eines Arrays nicht geändert oder der Index aktualisiert werden muss, wenn ein Element an einer beliebigen Position innerhalb der Auflistung hinzugefügt wird. Nur Verweise in umgebenden Elementen ändern sich.

3.3. Speichernutzung

Eine LinkedList verbraucht mehr Speicher als eine ArrayList, da jeder Knoten in einer LinkedList zwei Referenzen speichert, eine für das vorherige Element und eine für das nächste Element, während ArrayList nur Daten und deren Index enthält.

4. Verwendung

Hier sind einige Codebeispiele, die zeigen, wie Sie LinkedList verwenden können :

4.1. Schaffung

LinkedList linkedList = new LinkedList();

4.2. Element hinzufügen

LinkedList implementiert Liste und Deque - Schnittstelle, neben Standard add () und addAll () Methoden finden Sie addFirst () und addlast () , die ein Element am Anfang oder am Ende addiert ist.

4.3. Element entfernen

Ähnlich wie beim Hinzufügen von Elementen bietet diese Listenimplementierung removeFirst () und removeLast ().

Es gibt auch die bequemen Methoden removeFirstOccurence () und removeLastOccurence (), die einen Booleschen Wert zurückgeben (true, wenn die Auflistung das angegebene Element enthält).

4.4. Warteschlangenoperationen

Die Deque- Schnittstelle bietet ein warteschlangenähnliches Verhalten (tatsächlich erweitert Deque die Warteschlangenschnittstelle ):

linkedList.poll(); linkedList.pop();

Diese Methoden rufen das erste Element ab und entfernen es aus der Liste.

Der Unterschied zwischen poll () und pop () besteht darin, dass pop NoSuchElementException () auf eine leere Liste wirft , während poll null zurückgibt. Die APIs pollFirst () und pollLast () sind ebenfalls verfügbar.

So funktioniert zum Beispiel die Push- API:

linkedList.push(Object o);

Womit das Element als Kopf der Sammlung eingefügt wird.

LinkedList verfügt über viele andere Methoden, von denen die meisten einem Benutzer bekannt sein sollten, der bereits Listen verwendet hat . Andere, die von Deque bereitgestellt werden, sind möglicherweise eine bequeme Alternative zu „Standard“ -Methoden.

Die vollständige Dokumentation finden Sie hier.

5. Schlussfolgerung

ArrayList ist normalerweise die Standardimplementierung von List .

Es gibt jedoch bestimmte Anwendungsfälle, in denen die Verwendung von LinkedList besser passt, z. B. Einstellungen für eine konstante Einfüge- / Löschzeit (z. B. häufiges Einfügen / Löschen / Aktualisieren) über eine konstante Zugriffszeit und eine effektive Speichernutzung.

Codebeispiele finden Sie auf GitHub.