Was ist der Unterschied zwischen HashSet und Set?

80

Sah das Code-Snippet wie

Set<Record> instances = new HashSet<Record>();

Ich frage mich, ob Hashset eine besondere Art von Set ist. Gibt es einen Unterschied zwischen ihnen?

user496949
quelle
8
Vielleicht möchten Sie das Konzept der Schnittstellen
Nikita Rybak

Antworten:

96

A steht Setfür einen generischen "Wertesatz". A TreeSetist eine Menge, in der die Elemente sortiert (und damit geordnet) sind, a HashSetist eine Menge, in der die Elemente nicht sortiert oder geordnet sind.

A HashSetist normalerweise viel schneller als a TreeSet.

A TreeSetist typischerweise als Rot-Schwarz-Baum implementiert (siehe http://en.wikipedia.org/wiki/Red-black_tree - Ich habe die tatsächliche Umsetzung der Sonne / Oracle nicht validiert TreeSet), während ein HashSetEinsatz Object.hashCode()einen Index zu erstellen , in eine Anordnung. Die Zugriffszeit für einen rot-schwarzen Baum beträgt, O(log(n))während die Zugriffszeit für einen HashSetBereich von der konstanten Zeit bis zum ungünstigsten Fall (jedes Element hat denselben Hashcode) reicht, wobei Sie eine lineare Suchzeit haben können O(n).

Erik
quelle
Darüber hinaus gibt es folgende Allzweckimplementierungen: LinkedHashSet (eine Variante von HashSet, die eine gewisse Reihenfolge für den Iterator beibehält), ConcurrentSkipListSet (eine threadsave SortedSet-Implementierung), CopyOnWriteArraySet (eine threadsichere Variante, die für "viele Lesevorgänge" optimiert ist, sehr selten schreibt "), EnumSet (funktioniert nur bei Aufzählungstypen für die Elemente, ist dann aber noch schneller als HashSet).
Paŭlo Ebermann
7
@Erik: Ich bitte Sie, Ihre Antwort zu bearbeiten. TreeSet ist sortiert und nicht bestellt. HashSet = ungeordnet, TreeSet = sortiert, LinkedHashSet = bestellt. Bitte ändern Sie Ihre Antwort entsprechend
Rais Alam
Hashset kann langsamer sein, wenn die Implementierung von hashCode schlecht ist (z. B. immer den gleichen Hashcode zurückgeben)
Romain Hautefeuille
34

Das HashSetist eine Implementierung von a Set.

Vaugham
quelle
13
Ich verstehe diesen Kommentar nicht. Die Frage ist "Was ist der Unterschied" und nicht "Was ist die Beziehung zwischen".
Jambox
7
Er erklärte den Unterschied: Set ist die Schnittstelle, HashSet ist die Implementierung dieser Schnittstelle. Daher handelt es sich nicht um unterschiedliche Implementierungen. HashSet ist einfach eine der Implementierungen von Set (die andere Implementierung ist TreeSet).
AggieDev
klingt nach einer gültigen Antwort für mich
Romain Hautefeuille
2
Hat dir eine Ablehnung hinterlassen, weil du die Frage überhaupt nicht beantwortet hast. In Zukunft empfehle ich Ihnen, einige Dokumentationen, Beispiele und Vergleiche hinzuzufügen. Wenn Sie nur einen einzigen Satz schreiben und der größte Teil des Inhalts nur Links zu anderen Stellen enthält , beantworten Sie NICHT Fragen zum Stapelüberlauf.
Urda
Diese Frage wurde vor 6 Jahren beantwortet (siehe oben), aber danke.
Vaugham
16

Die Frage wurde beantwortet, aber ich habe keine Antwort darauf gesehen, warum der Code beide Typen im selben Code erwähnt.

In der Regel möchten Sie gegen Schnittstellen codieren, die in diesem Fall Set sind. Warum? Wenn Sie Ihr Objekt immer über Schnittstellen referenzieren (mit Ausnahme des neuen HashSet ()), ist es trivial, die Implementierung des Objekts später zu ändern, wenn Sie feststellen, dass dies besser ist, da Sie es in Ihrem Code nur einmal erwähnt haben base (wo du neues HashSet () gemacht hast).

MeBigFatGuy
quelle
12

Set ist eine Sammlung, die keine doppelten Elemente enthält. Set ist eine Schnittstelle.

HashSet implementiert die SetSchnittstelle, die von einer Hash-Tabelle (eigentlich einer HashMapInstanz) unterstützt wird.

Da HashSetist eine der spezifischen Implementierungen der SetSchnittstelle.

A Setkann eine der folgenden sein, da es von den folgenden Klassen implementiert wurde

ConcurrentSkipListSet : Eine skalierbare gleichzeitige NavigableSet-Implementierung basierend auf a ConcurrentSkipListMap. Die Elemente des Satzes werden nach ihrer natürlichen Reihenfolge oder nach einem zum ComparatorZeitpunkt der Satzerstellung bereitgestellten sortiert gehalten , je nachdem, welcher Konstruktor verwendet wird.

CopyOnWriteArraySet : Ein Set, das für alle Vorgänge eine interne CopyOnWriteArrayList verwendet.

EnumSet : Eine spezielle Set-Implementierung zur Verwendung mit Aufzählungstypen. Alle Elemente in einem Aufzählungssatz müssen von einem einzelnen Aufzählungstyp stammen, der beim Erstellen des Satzes explizit oder implizit angegeben wird.

TreeSet : Eine NavigableSet-Implementierung basierend auf einer TreeMap. Die Elemente werden in ihrer natürlichen Reihenfolge oder von einem zum festgelegten Erstellungszeitpunkt bereitgestellten Komparator geordnet, je nachdem, welcher Konstruktor verwendet wird.

LinkedHashSet : Implementierung der Ash-Tabelle und der verknüpften Liste der Set-Schnittstelle mit vorhersagbarer Iterationsreihenfolge. Diese Implementierung unterscheidet sich von HashSet dadurch, dass eine doppelt verknüpfte Liste geführt wird, die alle Einträge durchläuft.

Aber HashSetkann nur sein , LinkedHashSetda LinkedHashSetSubklassenHashSet

Ravindra Babu
quelle
8

Set ist die allgemeine Schnittstelle zu einer setartigen Sammlung, während HashSet eine spezifische Implementierung der Set-Schnittstelle ist (die Hash-Codes verwendet, daher der Name).

gmw
quelle
2

Set ist eine übergeordnete Schnittstelle aller Set-Klassen wie TreeSet, LinkedHashSet usw.

HashSet ist eine Klasse, die die Set-Schnittstelle implementiert.

unk1102
quelle
0

HashSet ist eine Klasse, die von der Set-Schnittstelle abgeleitet ist. Als abgeleitete Klasse von Set erreicht das HashSet die Eigenschaften von Set. Wichtige und am häufigsten verwendete abgeleitete Klassen von Set sind HashSet und TreeSet.

Hemlata Gehlot
quelle
-1

** **.

  • Einstellen:

** Es handelt sich um eine Schnittstelle, die genau wie LIST und QUEUE ein Subtyp der Collection-Schnittstelle ist.

Set hat weniger als 3 Unterklassen, es wird verwendet, um mehrere Objekte ohne Duplikate zu speichern.

  1. HashSet
  2. LinkedHashSet
  3. TreeSet (das die SortedSet-Schnittstelle implementiert)

** **.

  • HashSet:

** **.

Kann einen NULL-Wert verwenden (da Duplizieren nicht zulässig ist), werden Daten zufällig gespeichert, da die Reihenfolge nicht beibehalten wird.

Anonymer Benutzer
quelle