Was ist der Unterschied zwischen ihnen? ich weiß das
Ein LinkedHashSet ist eine geordnete Version von HashSet, die eine doppelt verknüpfte Liste über alle Elemente hinweg verwaltet. Verwenden Sie diese Klasse anstelle von HashSet, wenn Sie sich für die Iterationsreihenfolge interessieren. Wenn Sie ein HashSet durchlaufen, ist die Reihenfolge nicht vorhersehbar, während Sie mit einem LinkedHashSet die Elemente in der Reihenfolge durchlaufen können, in der sie eingefügt wurden.
Im Quellcode von LinkedHashSet gibt es jedoch nur aufrufende Konstruktoren von HashSet. Wo ist also die doppelt verknüpfte Liste und die Einfügereihenfolge?
java
hashset
linkedhashset
Shikarn-O
quelle
quelle
Antworten:
Die Antwort liegt in dem Konstruktoren die
LinkedHashSet
verwendet die Basisklasse zu konstruieren:Und (ein Beispiel für) einen
HashSet
Konstruktor, der ein boolesches Argument verwendet, wird beschrieben und sieht folgendermaßen aus:quelle
LinkedHashSet
Die Konstruktoren von 'rufen den folgenden Basisklassenkonstruktor auf:Wie Sie sehen können, ist die interne Karte a
LinkedHashMap
. Wenn Sie nach innen schauenLinkedHashMap
, werden Sie das folgende Feld entdecken:Dies ist die betreffende verknüpfte Liste.
quelle
HashSet ist ungeordnet und unsortiert Set.
LinkedHashSet ist die bestellte Version von HashSet.
Der einzige Unterschied zwischen HashSet und LinkedHashSet besteht darin, dass:
LinkedHashSet die Einfügereihenfolge beibehält.
Wenn wir ein HashSet durchlaufen , ist die Reihenfolge unvorhersehbar, während sie im Fall von LinkedHashSet vorhersehbar ist .
Der Grund dafür, wie LinkedHashSet die Einfügereihenfolge beibehält, ist folgender:
Die zugrunde liegende verwendete Datenstruktur ist Double-Linked-List .
quelle
Sie sollten sich die Quelle des
HashSet
Konstruktors ansehen, den es aufruft ... es ist ein spezieller Konstruktor, der die Sicherung zuMap
einemLinkedHashMap
statt nur zu einem machtHashMap
.quelle
Ich schlage vor , Sie verwenden die
LinkedHashSet
meiste Zeit, weil es insgesamt eine bessere Leistung ):HashMap
, da wir die meiste Zeit Set-Strukturen zum Iterieren verwenden.Sie können die Quelltestseite hier sehen: Das endgültige Beispiel für Leistungstests
quelle
HashSet: Eigentlich ungeordnet. Wenn Sie den Parameter übergeben, bedeutet dies
Ausgabe: Kann
2,1,3
nicht vorhersehbar sein. nächstes Mal eine andere Bestellung.LinkedHashSet()
die FIFO-Ordnung erzeugen.quelle
HashSet
Sie halten nicht die Reihenfolge der Einfügungen ArtikelLinkedHashSet
halten die Reihenfolge der Einfügungen ArtikelBeispiel
HashSet
AusgabeLinkedHashSet
Ausgabequelle
HashSet:
Die unterstrichene Datenstruktur ist Hashtable. Doppelte Objekte sind nicht zulässig. Die Einfügereihenfolge wird nicht beibehalten und basiert auf dem Hash-Code von Objekten. Das Einfügen von Null ist möglich (nur einmal). Es implementiert die Schnittstelle Serializable, Clonable, aber nicht RandomAccess. HashSet ist die beste Wahl, wenn es sich bei der häufigen Operation um eine Suchoperation handelt.
Konstruktoren:
LinkedHashSet:
Es ist eine untergeordnete Klasse von HashSet. Es ist genau das gleiche wie HashSet einschließlich (Konstruktoren und Methoden), mit Ausnahme der folgenden Unterschiede.
Unterschiede HashSet:
LinkedHashSet:
quelle
Wenn Sie sich die Konstruktoren ansehen, die von der
LinkedHashSet
Klasse aufgerufen werden, werden Sie feststellen, dass sie internLinkedHashMap
zu Sicherungszwecken verwendet werden.quelle
Alle Methoden und Konstruktoren sind gleich, aber nur ein Unterschied besteht darin, dass LinkedHashset die Einfügereihenfolge beibehält, jedoch keine Duplikate zulässt.
Hashset behält keine Einfügereihenfolge bei. Es ist eine Kombination aus List und Set simple :)
quelle