Eine Anleitung zur Java LinkedList

Ein Leitfaden zur Java LinkedList

1. Einführung

LinkedList ist eine doppelt verknüpfte Listenimplementierung der SchnittstellenList undDeque. Es implementiert alle optionalen Listenoperationen und erlaubt alle Elemente (einschließlichnull).

2. Eigenschaften

Nachfolgend finden Sie die wichtigsten Eigenschaften derLinkedList:

  • Operationen, die in die Liste indizieren, durchlaufen die Liste vom Anfang bis zum Ende, je nachdem, welcher Wert näher am angegebenen Index liegt

  • Es ist nichtsynchronized

  • Die IteratorenIterator undListIterator sindfail-fast (was bedeutet, dass nach der Erstellung des Iterators, wenn die Liste geändert wird, einConcurrentModificationException ausgelöst wird).

  • Jedes Element ist ein Knoten, der auf das nächste und vorherige verweist

  • Die Einfügereihenfolge wird beibehalten

ObwohlLinkedList nicht synchronisiert ist, können wir eine synchronisierte Version davon abrufen, indem wir die MethodeCollections.synchronizedList aufrufen, wie:

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

3. Vergleich mitArrayList

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

3.1. Struktur

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

Andererseits speichert einLinkedList seine Daten als Liste von Elementen und jedes Element ist mit seinem vorherigen und nächsten Element verknüpft. In diesem Fall hat die Suchoperation nach einem Element eine Ausführungszeit von O (n).

3.2. Operationen

Das Einfügen, Hinzufügen und Entfernen eines Elements ist inLinkedList 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 Sammlung hinzugefügt wird, sondern nur Verweise auf umgebende Elemente wird sich verändern.

3.3. Speichernutzung

EinLinkedList verbraucht mehr Speicher als einArrayList, da jeder Knoten in einemLinkedList zwei Referenzen speichert, eine für sein vorheriges Element und eine für sein nächstes Element, währendArrayList gilt nur Daten und deren Index.

4. Verwendungszweck

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

4.1. Schaffung

LinkedList linkedList = new LinkedList<>();



4.2. Element hinzufügen

LinkedList implementiert die SchnittstelleList undDeque. Neben den Standardmethodenadd() undaddAll() finden SieaddFirst() undaddLast() ein Element am Anfang bzw. am Ende.

4.3. Element entfernen

Ähnlich wie beim Hinzufügen von Elementen bietet diese ListenimplementierungremoveFirst() undremoveLast().

Es gibt auch die bequeme MethoderemoveFirstOccurence() undremoveLastOccurence(), die einen Booleschen Wert zurückgibt (true, wenn die Auflistung das angegebene Element enthält).

4.4. Warteschlangenoperationen

Die Schnittstelle vonDequebietet ein warteschlangenähnliches Verhalten (tatsächlich erweitertDeque die Schnittstelle vonQueue):

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

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

Der Unterschied zwischenpoll() undpop() besteht darin, dasspopNoSuchElementException() auf eine leere Liste wirft, währendpoll null zurückgibt. Die APIspollFirst() undpollLast() sind ebenfalls verfügbar.

So funktioniert beispielsweise die API vonpush:

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 bereitsLists verwendet hat. Andere, die vonDeque bereitgestellt werden, sind möglicherweise eine bequeme Alternative zu „Standard“ -Methoden.

Die vollständige Dokumentation finden Sie unterhere.

5. Fazit

ArrayList ist normalerweise die Standardimplementierung vonList.

Es gibt jedoch bestimmte Anwendungsfälle, in denen die Verwendung vonLinkedList besser passt, z. B. Präferenzen 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 inover on GitHub.