Unterschied zwischen HashSet und HashMap?


168

HashSetWas ist der Unterschied zwischen HashMapund, abgesehen von der Tatsache, dass keine doppelten Werte zulässig sind HashSet?

Ich meine Implementierung weise? Es ist ein bisschen vage, weil beide Hash-Tabellen verwenden , um Werte zu speichern.


HashSet wird mit HashMap implementiert
therealprashant

Ich denke, zu wissen, warum HashSet anders ist als ArrayList, wird Ihnen helfen, die Antwort auf Ihre obige Frage zu verstehen: stackoverflow.com/questions/18706870/…
djangofan

Antworten:


150

Sie sind ganz andere Konstrukte. A HashMapist eine Implementierung von Map. Eine Karte ordnet Schlüssel Werten zu. Die Schlüsselsuche erfolgt mit dem Hash.

Auf der anderen Seite ist a HashSeteine Implementierung von Set. Ein Set ist so konzipiert, dass es mit dem mathematischen Modell eines Sets übereinstimmt. A HashSetverwendet a HashMap, um seine Implementierung zu unterstützen, wie Sie bemerkt haben. Es wird jedoch eine völlig andere Schnittstelle implementiert.

Wenn Sie nach dem Besten Collectionfür Ihre Zwecke suchen , ist dieses Tutorial ein guter Ausgangspunkt. Wenn Sie wirklich wissen wollen, was los ist, gibt es auch dafür ein Buch .


Diese Aussage ist etwas simpel. Unter der Decke ist noch etwas los. "" Gibt einen Hash-Wert für das angegebene Objekt zurück. Zusätzlich zum eigenen hashCode des Objekts wendet diese Methode eine "zusätzliche Hash-Funktion" an, die sich gegen Hash-Funktionen von schlechter Qualität schützt. Dies ist wichtig , da HashMap Hash-Tabellen mit einer Länge von zwei Längen verwendet. " Weblogs.java.net/blog/2005/06/18/hashmap-implementation - Wenn Sie sich jedoch das Dokument ansehen, werden Sie feststellen , dass dieser Hash Dinge verteilt über "Eimer", also glaube ich am Ende, dass zwei Dinge auf den gleichen Eimer abgebildet werden können.
Justkt

1
Um Ihre zweite Frage zu beantworten - nein. Eine Karte ist, wenn Sie möchten (Schlüssel -> Wert), wie in der ausgezeichneten Antwort von @Bruno Rothgiesser definiert. Ein Satz ist für nicht doppelte Elemente. Wenn Sie Duplikate und nicht Schlüssel-> Wert möchten, würde ich eine Implementierung von java.util.List überprüfen. Eine endgültige Anleitung finden Sie im Collection-Tutorial: java.sun.com/docs/books/tutorial/collections/index.html
justkt

@justk: Ja, Sie können zwei Schlüssel in einem Bucket erhalten, und dann wird equals () verwendet, um zwischen ihnen zu unterscheiden. Deshalb ist es wichtig, dass hashCode () und equals () kompatibel sind.
Michael Borgwardt

6
@SpikETidE: Weder HashMap noch HashSet erlauben Duplikate. Das ist der springende Punkt.
Michael Borgwardt

23
@SpikETidE: Eine Menge hat keine Schlüssel / Wert-Paare, nur Elemente. Und HashSet wird implementiert, indem eine HashMap mit den festgelegten Elementen als Schlüsseln und dem Wert, der ignoriert wird, vorhanden ist.
Michael Borgwardt

300

HashSet ist eine Menge , zB {1,2,3,4,5}

HashMap ist eine Schlüssel -> Wert - Karte (Schlüssel zu Wert), z. B. {a -> 1, b -> 2, c -> 2, d -> 1}

Beachten Sie in meinem obigen Beispiel, dass es in der HashMap keine doppelten Schlüssel geben darf, aber möglicherweise doppelte Werte.

Im HashSet dürfen keine doppelten Elemente vorhanden sein.


Der (interessanteste) Grund für die Verwirrung ist jedoch, dass Sie selbst in HashSet einen "Schlüssel" benötigen, um auf die Elemente zuzugreifen. Das heißt, Objekte haben auch in der Mathematik Namen (oder Adressen), wenn auf sie zugegriffen oder verwiesen werden soll. In diesem Sinne ist ein HashSet eine besonders einfache HashMap, die mit den Namen (oder Adressen) ihrer Elemente versehen ist.
Andrew Marshall

65

HashSet

  1. Die HashSet-Klasse implementiert die Set-Schnittstelle
  2. In HashSet speichern wir Objekte (Elemente oder Werte), z. B. Wenn wir ein HashSet mit Zeichenfolgenelementen haben, kann es eine Reihe von HashSet-Elementen darstellen: {"Hallo", "Hallo", "Tschüss", "Ausführen"}
  3. HashSet erlaubt keine doppelten Elemente, was bedeutet, dass Sie keine doppelten Werte in HashSet speichern können.
  4. HashSet erlaubt einen einzigen Nullwert.
  5. HashSet ist nicht synchronisiert, was bedeutet, dass sie erst dann für threadsichere Operationen geeignet sind, wenn sie explizit synchronisiert wurden. [Ähnlichkeit]

                          add      contains next     notes
    HashSet               O(1)     O(1)     O(h/n)   h is the table 

HashMap

  1. Die HashMap-Klasse implementiert die Map-Schnittstelle
  2. HashMap wird zum Speichern von Schlüssel- und Wertepaaren verwendet. Kurz gesagt, die Zuordnung von Schlüssel und Wert wird beibehalten. (Die HashMap-Klasse entspricht in etwa Hashtable, außer dass sie nicht synchronisiert ist und Nullen zulässt.) Auf diese Weise können Sie HashMap-Elemente darstellen, wenn sie einen ganzzahligen Schlüssel und einen Wert vom Typ String haben: zB {1 -> ”Hallo”, 2 -> ”Hallo”, 3 -> ”Tschüss”, 4 -> ”Ausführen”}
  3. HashMap erlaubt keine doppelten Schlüssel, erlaubt jedoch doppelte Werte.
  4. HashMap erlaubt einen einzelnen Nullschlüssel und eine beliebige Anzahl von Nullwerten.
  5. HashMap ist nicht synchronisiert, was bedeutet, dass sie erst dann für threadsichere Vorgänge geeignet sind, wenn sie explizit synchronisiert wurden. [Ähnlichkeit]

                           get      containsKey next     Notes
     HashMap               O(1)     O(1)        O(h/n)   h is the table 

Weitere Informationen finden Sie in diesem Artikel .


36

Es ist wirklich eine Schande, dass beide Namen mit Hash beginnen . Das ist der am wenigsten wichtige Teil von ihnen. Die wichtigen Teile kommen nach dem Hash - das Set und die Karte , wie andere betont haben. Was sie sind, sind jeweils ein Set - eine ungeordnete Sammlung - und eine Karte - eine Sammlung mit verschlüsseltem Zugriff. Sie werden zufällig mit Hashes implementiert - daher kommen die Namen -, aber ihre Essenz verbirgt sich hinter diesem Teil ihrer Namen.

Lassen Sie sich nicht durch ihre Namen verwirren. Sie sind zutiefst verschiedene Dinge.


@HiteshSahu Beide sind mit Hash-Tabellen ( en.wikipedia.org/wiki/Hash_table ) implementiert . Dies ist eine gute Datenstruktur zur Darstellung einer Menge, die auf die richtige Weise effizient ist, und im Wesentlichen werden die Schlüssel einer HashMap als HashSet implementiert. Wer auch immer sie nannte, machte sich einige Mühe, sie zu implementieren, und konzentrierte sich eher auf die Implementierung als auf ihren Zweck (auf eine Vermutung).
Carl Manaster

1
Gut erklärt. Danke dir.
user3932000

5

Das Hashsetintern implementiert HashMap. Wenn Sie die interne Implementierung sehen, werden die in HashSet eingefügten Werte als Schlüssel in der HashMap gespeichert und der Wert ist ein Dummy-Objekt der Object-Klasse.
Der Unterschied zwischen HashMap und HashSet ist: -

  1. HashMap enthält Schlüsselwertpaare und auf jeden Wert kann über einen Schlüssel zugegriffen werden, wobei HashSet jedes Mal iteriert werden muss, da es keine get-Methode gibt.
  2. HashMapImplementiert die Map-Schnittstelle und erlaubt einen Nullwert als Schlüssel und mehrere Nullwerte als Werte. Wenn HashSetdie Set-Schnittstelle implementiert wird, erlaubt sie nur einen Nullwert und keine doppelten Werte. (Denken Sie daran, dass ein Nullschlüssel im HashMap-Schlüssel zulässig ist, daher ein Nullwert in HashSet wie HashSet HashMap intern implementiert).
  3. HashSetund HashMapbehält die Reihenfolge des Einfügens während der Iteration nicht bei.

3

Mit HashSet können wir Objekte in der Menge speichern, während wir mit HashMap Objekte auf der Basis von Schlüssel und Wert speichern können. Jedes Objekt oder gespeicherte Objekt hat einen Schlüssel.


2

Wie der Name schon sagt, ein HashMap ist ein assoziatives Karte (Mapping von einem Schlüssel auf einen Wert), ein HashSet nur ist Set .


2
@SpikETidE Das ist ein Detail der Implementierung der Eindeutigkeit, aber die Bedeutung von HashSet besteht darin, eine Menge zu implementieren.
Michael Borgwardt

1
Also ... alles läuft darauf hinaus, "wenn Sie keine Duplikate wollen, verwenden Sie hashSet ... Wenn Sie sich nicht um Duplikate kümmern, verwenden Sie HashMap" ....?
SpikETidE

3
Java implementiert keine bestimmte Klasse für eine "Sammlung mit potenziell duplizierten Elementen" (eine "Tasche"). Sie können hierfür eine Liste verwenden (obwohl eine Liste der Tasche eine gewisse Semantik hinzufügt: Reihenfolge; Sie können dies jedoch ignorieren).
Leonbloy

2

Unterschiede zwischen HashSet und HashMap in Java

1) Der erste und wichtigste Unterschied zwischen HashMap und HashSet besteht darin, dass HashMap eine Implementierung der Map-Schnittstelle ist, während HashSet eine Implementierung der Set-Schnittstelle ist. Dies bedeutet, dass HashMap eine auf Schlüsselwerten basierende Datenstruktur ist und HashSet die Eindeutigkeit garantiert, indem keine Duplikate zugelassen werden Realität HashSet ist ein Wrapper um HashMap in Java. Wenn Sie sich die Code of Add (E e) -Methode von HashSet.java ansehen, sehen Sie folgenden Code:

public boolean add(E e) 
{
    return map.put(e, PRESENT)==null;
}

Dabei ist das Einfügen des Objekts in die Karte als Schlüssel und Wert ein endgültiges PRESENT-Objekt, das Dummy ist.

2) Der zweite Unterschied zwischen HashMap und HashSet besteht darin, dass wir die add () -Methode verwenden, um Elemente in Set einzufügen, aber die put () -Methode, um Schlüssel und Wert in HashMap in Java einzufügen.

3) HashSet erlaubt nur einen Nullschlüssel, aber HashMap kann einen Nullschlüssel + mehrere Nullwerte zulassen.

Das hängt alles vom Unterschied zwischen HashSet und HashMap in Java ab. Zusammenfassend sind HashSet und HashMap zwei verschiedene Arten von Sammlungen, von denen eine festgelegt und die andere Map ist.


2

Unterschiede zwischen HashSet und HashMap in Java

HashSet verwendet HashMap intern zum Speichern von Objekten. Wenn die Methode add (String) aufgerufen wird, ruft sie die HahsMap-Methode put (Schlüssel, Wert) auf, wobei key = String object & value = new Object (Dummy). Daher werden keine Duplikate beibehalten, da Schlüssel nichts anderes als Value sind Objekt.

Die Objekte, die als Schlüssel in Hashset / HashMap gespeichert sind, sollten den Hashcode überschreiben und den Vertrag gleichsetzen.

Schlüssel, die zum Zugreifen auf / Speichern von Wertobjekten in HashMap verwendet werden, sollten als endgültig deklariert werden, da das Wertobjekt beim Ändern nicht gefunden werden kann und null zurückgibt.


1

A HashMapist das Hinzufügen, Abrufen, Entfernen, ... von Objekten, die mit einem benutzerdefinierten Schlüssel eines beliebigen Typs indiziert sind.
A HashSetbesteht darin, Elemente hinzuzufügen, Elemente zu entfernen und zu überprüfen, ob Elemente vorhanden sind, indem ihre Hashes verglichen werden.

Eine HashMap enthält also die Elemente und ein HashSet merkt sich ihre Hashes.


1
Durch Vergleichen ihrer Hashes und Aufrufen ihrer equals()Methoden.
Marquis von Lorne

1

Unterschiede: in Bezug auf die Hierarchie: HashSet implementiert Set. HashMap implementiert Map und speichert eine Zuordnung von Schlüsseln und Werten.

Eine Verwendung von HashSet und HashMap in Bezug auf die Datenbank würde Ihnen helfen, die Bedeutung der einzelnen zu verstehen.
HashSet: wird im Allgemeinen zum Speichern eindeutiger Sammlungsobjekte verwendet. Beispiel: Es kann als Implementierungsklasse zum Speichern von Viele-zu-Eins-Beziehungen zwischen verwendet werden
Klasse Item und Class Bid verwendet werden, wobei (Item hat viele Gebote) HashMap: wird verwendet, um einen Schlüssel dem Wert zuzuordnen. Der Wert kann null oder ein beliebiges Objekt sein / Liste des Objekts (welches Objekt an sich ist).



0

Ein HashSet verwendet eine HashMap intern, um seine Einträge zu speichern. Jeder Eintrag in der internen HashMap wird von einem einzelnen Objekt verschlüsselt, sodass alle Einträge in denselben Bucket gehasht werden. Ich erinnere mich nicht, was die interne HashMap zum Speichern ihrer Werte verwendet, aber es spielt keine Rolle, da dieser interne Container niemals doppelte Werte enthalten wird.

EDIT : Um Matthews Kommentar anzusprechen, hat er Recht; Ich hatte es rückwärts. Die interne HashMap ist mit den Objekten versehen, aus denen die Set-Elemente bestehen . Die Werte der HashMap sind ein Objekt, das einfach in den HashMap-Buckets gespeichert wird.


Das ist nicht richtig. Die Set-Elemente werden direkt als HashMap-Schlüssel verwendet.
Matthew Flaschen

0

HashMapist eine MapImplementierung, die doppelte Werte, aber keine doppelten Schlüssel zulässt. . Zum Hinzufügen eines Objekts ist ein Schlüssel / Wert-Paar erforderlich. Nullschlüssel und Nullwerte sind zulässig. z.B:

{The-> 3, world-> 5, is-> 2, nice-> 4}

HashSetist eine SetImplementierung, die keine Duplikate zulässt. Wenn Sie versucht haben, ein doppeltes Objekt hinzuzufügen, einen Aufruf der public boolean add(Object o)Methode, bleibt die Menge unverändert und kehrt zurück false. z.B:

[Die Welt ist nett]


-1

Sie haben Ihre eigene Frage so ziemlich beantwortet - Hashset erlaubt keine doppelten Werte. Es wäre trivial, ein Hashset mithilfe einer Hintergrund-Hashmap zu erstellen (und nur zu überprüfen, ob der Wert bereits vorhanden ist). Ich denke, die verschiedenen Java-Implementierungen tun dies entweder oder implementieren einen benutzerdefinierten Code, um dies effizienter zu tun.


1
@oedo - java.util.HashSetsagt, dass dies durch a unterstützt wird java.util.HashMap.
Justkt

2
Das Nichtzulassen von Duplikaten ist kein Unterschied zwischen ihnen.
Marquis von Lorne

-1

Grundsätzlich muss der Benutzer in HashMap sowohl Schlüssel als auch Wert angeben, während in HashSet nur Wert angegeben wird. Der Schlüssel wird mithilfe der Hash-Funktion automatisch aus Wert abgeleitet. Nachdem sowohl Key als auch Value vorhanden sind, kann HashSet intern als HashMap gespeichert werden.


Der Schlüssel ist der Wert in einem HashSet.
Marquis von Lorne

-1

HashSet und HashMap speichern beide Paare. Der Unterschied besteht darin, dass Sie in HashMap einen Schlüssel angeben können, während der Schlüssel in HashSet aus dem Hashcode des Objekts stammt


Wenn dies zutrifft, kann HashSet nicht mehrere Objekte mit demselben Hashcode speichern, und das tut es auch.
Marquis von Lorne

-1

HashMapsErlaube einen Nullschlüssel und Nullwerte. Sie sind nicht synchronisiert, was die Effizienz erhöht. Wenn es erforderlich ist, können Sie sie mit synchronisierenCollections.SynchronizedMap()

Hashtables Erlaube keine Nullschlüssel und bin synchronisiert.


Er fragte nicht nach Hashtables. Beantwortet die Frage nicht.
Marquis von Lorne

-2

HashMap ist eine Implementierung der Map-Schnittstelle. HashSet ist eine Implementierung der Set-Schnittstelle

HashMap Speichert Daten in Form eines Schlüsselwertpaars. HashSet Nur Objekte speichern

Die Put-Methode wird zum Hinzufügen eines Elements zur Karte verwendet. Die Add-Methode wird zum Hinzufügen des Elements Set verwendet

In der Hash-Map wird der Hashcode-Wert unter Verwendung des Schlüsselobjekts berechnet. Hier wird das Mitgliedsobjekt zur Berechnung des Hashcode-Werts verwendet, der für zwei Objekte gleich sein kann. Daher wird die Methode equal () verwendet, um die Gleichheit zu überprüfen, wenn false zurückgegeben wird, was bedeutet, dass zwei Objekte unterschiedlich sind.

HashMap ist schneller als Hashset, da für den Zugriff auf das Objekt ein eindeutiger Schlüssel verwendet wird. HashSet ist langsamer als Hashmap


1
Sie haben im Wesentlichen die gleiche Leistung und "weil ein eindeutiger Schlüssel verwendet wird" ist falsch.
Marquis von Lorne
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.