Was ist der Unterschied zwischen HashSet und Set?

Lesezeit: 4 Minuten

Benutzer-Avatar
Benutzer496949

Sah das Code-Snippet wie

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

Ich frage mich, ob Hashset eine spezielle Art von Set ist. Irgendein Unterschied zwischen ihnen?

  • Vielleicht möchten Sie sich das Konzept von ansehen Schnittstellen

    – Nikita Rybak

    28. Februar 2011 um 8:40 Uhr


Benutzer-Avatar
Erik

EIN Set stellt einen generischen “Wertesatz” dar. EIN TreeSet ist eine Menge, in der die Elemente sortiert (und damit geordnet) sind, a HashSet ist eine Menge, in der die Elemente sind nicht sortiert oder geordnet.

EIN HashSet ist normalerweise viel schneller als a TreeSet.

EIN TreeSet wird typischerweise als Rot-Schwarz-Baum implementiert (siehe http://en.wikipedia.org/wiki/Red-black_tree – Ich habe die tatsächliche Implementierung von Sonne/Orakel nicht validiert TreeSet), während a HashSet Verwendet Object.hashCode() um einen Index in einem Array zu erstellen. Zugriffszeit für einen rot-schwarzen Baum ist O(log(n)) während die Zugriffszeit für a HashSet reicht von konstanter Zeit bis zum schlimmsten Fall (jedes Element hat denselben HashCode), bei dem Sie eine lineare Suchzeit haben können O(n).

  • Zusätzlich gibt es diese Allzweck-Implementierungen: LinkedHashSet (eine Variante von HashSet, die eine gewisse Ordnung für den Iterator beibehält), ConcurrentSkipListSet (eine threadsave SortedSet-Implementierung), CopyOnWriteArraySet (eine Thread-sichere Variante, optimiert für “viele Lesevorgänge, sehr selten schreibt”), EnumSet (das nur bei Enum-Typen für die Elemente funktioniert, dann aber noch schneller als HashSet ist).

    – Paulo Ebermann

    28. Februar 2011 um 22:36 Uhr

  • @Erik: Ich bitte darum, Ihre Antwort zu bearbeiten. TreeSet ist sortiert, nicht geordnet. HashSet = Ungeordnet, TreeSet = sortiert, LinkedHashSet = geordnet. Bitte ändern Sie Ihre Antwort entsprechend

    – Rais Alam

    4. Januar 2013 um 5:40 Uhr

  • Hashset kann langsamer sein, wenn die Implementierung von hashCode schlecht ist (z. B. immer denselben Hashcode zurückgeben)

    – Romain Hautefeuille

    30. März 2017 um 1:52 Uhr

Benutzer-Avatar
vaugham

Das HashSet ist eine Implementierung von a Set.

  • Ich verstehe diesen Kommentar nicht. Die Frage ist “was ist der Unterschied” und nicht “was ist die Beziehung zwischen”.

    – Marmeladebehälter

    2. April 2016 um 14:50 Uhr

  • Er erklärte den Unterschied, Set ist die Schnittstelle, HashSet ist die Implementierung dieser Schnittstelle. Daher sind sie keine unterschiedlichen Implementierungen, HashSet ist einfach eine der Implementierungen von Set (die andere Implementierung ist TreeSet).

    – AggieDev

    9. September 2016 um 19:49 Uhr

  • Hat Ihnen eine Ablehnung hinterlassen, weil Sie die Frage überhaupt nicht beantwortet haben. In Zukunft empfehle ich Ihnen, einige Dokumentationen, Beispiele und Vergleiche hinzuzufügen. Schreiben Sie einfach einen einzigen Satz, und der größte Teil des Inhalts besteht nur aus Links zu anderen Orten NICHT wie Sie Fragen zu Stack Overflow beantworten.

    – Urda

    21. September 2017 um 19:50 Uhr


  • Diese Frage wurde vor 6 Jahren beantwortet (siehe oben), aber danke.

    – vaugham

    1. März 2018 um 16:13 Uhr

  • Ich bin anderer Meinung, das Postdatum ist in diesem Fall eine relevante Information: Da zu diesem Zeitpunkt (vor Jahren) bereits eine vollständige Antwort gegeben wurde; dem war nichts mehr hinzuzufügen. Es wäre ein Dublon gewesen und es verstößt gegen SOs Etikette. Bitte öffnen Sie eine neue Antwort und tragen Sie bei, wenn Sie das Gefühl haben, dass etwas fehlt.

    – vaugham

    4. August 2018 um 20:05 Uhr

Benutzer-Avatar
Ravindra Babu

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

HashSet implementiert die Set Schnittstelle, unterstützt durch eine Hash-Tabelle (eigentlich eine HashMap Beispiel).

Seit HashSet ist eine der spezifischen Implementierungen von Set Schnittstelle.

EINSet kann eine der folgenden sein, da sie von den folgenden Klassen implementiert wurde

ConcurrentSkipListSet : Eine skalierbare gleichzeitige NavigableSet-Implementierung basierend auf a ConcurrentSkipListMap. Die Elemente der Menge werden gemäß ihrer natürlichen Ordnung oder durch a sortiert gehalten Comparator zur festgelegten Erstellungszeit bereitgestellt, je nachdem, welcher Konstruktor verwendet wird.

CopyOnWriteArraySet : Ein Set, das für alle seine Operationen eine interne CopyOnWriteArrayList verwendet.

EnumSet : Eine spezialisierte Set-Implementierung zur Verwendung mit Aufzählungstypen. Alle Elemente in einem Aufzählungssatz müssen von einem einzigen Aufzählungstyp stammen, der explizit oder implizit angegeben wird, wenn der Satz erstellt wird.

BaumSet :Eine NavigableSet-Implementierung basierend auf einer TreeMap. Die Elemente werden in ihrer natürlichen Reihenfolge oder durch einen Komparator geordnet, der zur festgelegten Erstellungszeit bereitgestellt wird, je nachdem, welcher Konstruktor verwendet wird.

LinkedHashSet: Ash-Tabelle und verkettete Listenimplementierung der Set-Schnittstelle mit vorhersagbarer Iterationsreihenfolge. Diese Implementierung unterscheidet sich von HashSet dadurch, dass sie eine doppelt verknüpfte Liste verwaltet, die alle ihre Einträge durchläuft.

Aber HashSet kann nur sein LinkedHashSet seit LinkedHashSet Unterklassen HashSet

Benutzer-Avatar
MeBigFatGuy

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

Normalerweise möchten Sie für Schnittstellen codieren, die in diesem Fall Set sind. Wieso den? Denn wenn Sie Ihr Objekt immer über Schnittstellen referenzieren (außer dem neuen HashSet()), ist es trivial, die Implementierung des Objekts später zu ändern, wenn Sie es für besser halten, da Sie es nur einmal in Ihrem Code erwähnt haben base (wo Sie new HashSet() gemacht haben).

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

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

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

Benutzer-Avatar
Hemlata Gehlot

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

1284040cookie-checkWas ist der Unterschied zwischen HashSet und Set?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy