Bitte beachten Sie den folgenden Code:
HashSet hs = new HashSet();
hs.add("hi"); -- (1)
hs.add("hi"); -- (2)
hs.size()
gibt 1, da HashSet
keine Duplikate zulässig sind, sodass nur ein Element gespeichert wird.
Ich möchte wissen, ob wir das doppelte Element hinzufügen. Ersetzt es dann das vorherige Element oder fügt es es einfach nicht hinzu?
Was passiert mit HashMap
dem gleichen Fall?
java
hashmap
duplicates
hashset
Anand
quelle
quelle
HashMap
, ob derkey
bereits vorhanden ist, bevor sieput
den Hintergrund aufrufenmap
.Set
, und das wird nie durch dieput()
Operation ersetzt.Set
, habe aber gerade erkannt, dass diesput()
nur den Wert überschreibt, nicht den Schlüssel. In diesem Fall ist es derselbe Wert, der erneut neben den Schlüssel gesetzt wird. Dies kann besser sein oder auch nicht, als zu überprüfen, ob der Schlüssel vorhanden ist, und ihn zu setzen. In jedem Fall verstehe ich, wie es funktioniert.HashSet
Implementierung in Form von aHashMap
. Schwer zu wissen, es sei denn, Sie sind einer der Entwickler der Klassen.Das erste, was Sie wissen müssen, ist, dass es sich
HashSet
wie ein verhältSet
, was bedeutet, dass Sie Ihr Objekt direkt zum hinzufügenHashSet
und es keine Duplikate enthalten kann. Sie fügen einfach Ihren Wert direkt hinzuHashSet
.Ist
HashMap
jedoch einMap
Typ. Das bedeutet, dass Sie jedes Mal, wenn Sie einen Eintrag hinzufügen, ein Schlüssel-Wert-Paar hinzufügen.In können
HashMap
Sie doppelte Werte haben, aber keine doppelten Schlüssel. ImHashMap
neuen Eintrag wird der alte ersetzt. Der letzte Eintrag wird in der seinHashMap
.Grundlegendes zur Verbindung zwischen HashMap und HashSet:
Denken Sie daran,
HashMap
kann keine doppelten Schlüssel haben. Hinter den KulissenHashSet
verwendet einHashMap
.Wenn Sie versuchen, ein Objekt zu einem hinzuzufügen
HashSet
, wird dieser Eintrag tatsächlich als Schlüssel imHashMap
- gespeichertHashMap
, der auch hinter den Kulissen von verwendet wirdHashSet
. Da dieser BasiswertHashMap
ein Schlüssel-Wert-Paar benötigt, wird für uns ein Dummy-Wert generiert.Wenn Sie nun versuchen, ein anderes doppeltes Objekt in dasselbe einzufügen
HashSet
, wird erneut versucht, es als Schlüssel in dasHashMap
darunter liegende Objekt einzufügen . AllerdingsHashMap
bietet keine Unterstützung für Duplikate. Daher,HashSet
wird immer noch nur ein Wert dieses Typs angezeigt. Nebenbei bemerkt, für jeden doppelten Schlüssel wird der Schlüssel überhaupt nicht ersetzt, da der für unseren Eintrag in HashSet generierte Wert ein Zufalls- / Dummy-Wert ist. Es wird ignoriert, da das Entfernen des Schlüssels und das Zurücksetzen desselben Schlüssels (der Dummy-Wert ist der gleiche) überhaupt keinen Sinn ergeben würde.Zusammenfassung:
HashMap
erlaubt Duplikatevalues
, aber nichtkeys
.HashSet
darf keine Duplikate enthalten.Um zu spielen, ob das Hinzufügen eines Objekts erfolgreich abgeschlossen wurde oder nicht, können Sie den
boolean
beim Aufruf zurückgegebenen Wert überprüfen.add()
und feststellen, ob er zurückgegeben wirdtrue
oderfalse
. Wenn es zurückgegeben wurdetrue
, wurde es eingefügt.quelle
HashMap allows duplicate values
HashMap ersetzt den alten Wert durch den neuen.Die Dokumente sind diesbezüglich ziemlich klar: ersetzt
HashSet.add
nicht :Aber wird ersetzen:
HashMap.put
quelle
Wenn es sich um HashSet handelt, wird es NICHT ersetzt.
Aus den Dokumenten:
http://docs.oracle.com/javase/6/docs/api/java/util/HashSet.html#add(E )
"Fügt das angegebene Element zu dieser Menge hinzu, wenn es noch nicht vorhanden ist. Fügt formeller das angegebene Element e zu dieser Menge hinzu, wenn diese Menge kein Element e2 enthält, so dass (e == null? E2 == null: e.equals ( e2)). Wenn diese Menge das Element bereits enthält, lässt der Aufruf die Menge unverändert und gibt false zurück. "
quelle
Korrigieren Sie mich, wenn ich falsch liege, aber was Sie erreichen, ist, dass mit Strings "Hi" == "Hi" nicht immer wahr wird (weil sie nicht unbedingt dasselbe Objekt sind).
Der Grund, warum Sie eine Antwort von 1 erhalten, ist, dass die JVM Zeichenfolgenobjekte nach Möglichkeit wiederverwendet. In diesem Fall verwendet die JVM das Zeichenfolgenobjekt erneut und überschreibt somit das Element in der Hashmap / Hashset.
Dieses Verhalten kann jedoch nicht garantiert werden (da es sich möglicherweise um ein anderes Zeichenfolgenobjekt handelt, das denselben Wert "Hi" hat). Das angezeigte Verhalten ist nur auf die Optimierung der JVM zurückzuführen.
quelle
Sie müssen zuerst die put-Methode in der Hash-Map überprüfen, da HashSet von HashMap gesichert wird
quelle
Anders ausgedrückt: Wenn Sie ein Schlüssel-Wert-Paar in eine HashMap einfügen, in der der Schlüssel bereits vorhanden ist (in gewissem Sinne gibt hashvalue () den gleichen Wert an und gleich () ist wahr, aber die beiden Objekte können sich dennoch auf verschiedene Weise unterscheiden ) wird der Schlüssel nicht ersetzt, aber der Wert wird überschrieben. Der Schlüssel wird nur verwendet, um den Hashwert () abzurufen und den Wert in der Tabelle damit zu finden. Da HashSet die Schlüssel einer HashMap verwendet und beliebige Werte festlegt, die (für den Benutzer) nicht wirklich wichtig sind, werden auch die Elemente des Satzes nicht ersetzt.
quelle
HashMap
enthält im Grunde genommen,Entry
was später enthältKey(Object)
undValue(Object)
.InternHashSet
sindHashMap
undHashMap
ersetzen Werte, wie einige von Ihnen bereits gezeigt haben .. aber ersetzt es wirklich die Schlüssel ??? Nein ..und das ist der Trick hier.HashMap
behält seinen Wert als Schlüssel im Basiswert beiHashMap
und der Wert ist nur ein Dummy-Objekt. Wenn Sie also versuchen, denselben Wert erneut in HashMap einzufügen (Schlüssel in der zugrunde liegenden Map). Ersetzt nur den Dummy-Wert und nicht den Schlüssel (Wert für HashSet).Sehen Sie sich den folgenden Code für die HashSet-Klasse an:
Hier ist e der Wert für HashSet, aber der Schlüssel für die zugrunde liegende Karte. Der Schlüssel wird niemals ersetzt. Ich hoffe, ich kann die Verwirrung beseitigen.
quelle