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 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).
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 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
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.