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?
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?
Antworten:
A steht Set
für einen generischen "Wertesatz". A TreeSet
ist eine Menge, in der die Elemente sortiert (und damit geordnet) sind, a HashSet
ist eine Menge, in der die Elemente nicht sortiert oder geordnet sind.
A HashSet
ist normalerweise viel schneller als a TreeSet
.
A TreeSet
ist 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 HashSet
Einsatz 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 HashSet
Bereich 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)
.
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).
Set ist eine Sammlung, die keine doppelten Elemente enthält. Set ist eine Schnittstelle.
HashSet implementiert die Set
Schnittstelle, die von einer Hash-Tabelle (eigentlich einer HashMap
Instanz) unterstützt wird.
Da HashSet
ist eine der spezifischen Implementierungen der Set
Schnittstelle.
A Set
kann 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 Comparator
Zeitpunkt 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 HashSet
kann nur sein , LinkedHashSet
da LinkedHashSet
SubklassenHashSet
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.
** **.
** 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.
** **.
** **.
Kann einen NULL-Wert verwenden (da Duplizieren nicht zulässig ist), werden Daten zufällig gespeichert, da die Reihenfolge nicht beibehalten wird.