Wird ein Hashwert / HashMap mit einem doppelten Wert hinzugefügt, wird der vorherige Wert ersetzt
Bitte betrachten Sie das folgende Stück code:
HashSet hs = new HashSet();
hs.add("hi"); -- (1)
hs.add("hi"); -- (2)
hs.size()
geben Sie 1 als HashSet
erlaubt keine Duplikate, so dass nur ein element gespeichert werden.
Ich will wissen, wenn wir fügen Sie die doppelte element, dann tut es ersetzt das Vorherige element oder es geht einfach nicht es?
Auch, was passieren wird, mitHashMap
für den gleichen Fall?
InformationsquelleAutor der Frage Anand | 2012-10-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Im Fall von
HashMap
, es ersetzt den alten Wert mit dem neuen.Im Fall von
HashSet
, wird das Element nicht eingefügt.InformationsquelleAutor der Antwort Keppil
Das erste, was Sie wissen müssen ist, dass
HashSet
wirkt wie einSet
, das heißt, Sie fügen Sie Ihr Objekt direkt auf derHashSet
und es können Duplikate enthalten. Fügen Sie einfach den Wert direkt inHashSet
.Jedoch
HashMap
ist einMap
geben. Das bedeutet, dass jedes mal, wenn Sie einen Eintrag hinzufügen, fügen Sie einen Schlüssel-Wert-paar.In
HashMap
können Sie doppelte Werte, aber nicht doppelte Schlüssel. InHashMap
den neuen Eintrag wird die alte ersetzen. Der neuste Eintrag wird in derHashMap
.Verständnis Link zwischen HashMap und HashSet:
Erinnern,
HashMap
kann keine doppelten Schlüssel. Hinter der SzeneHashSet
verwendet eineHashMap
.Wenn Sie versuchen, fügen Sie ein beliebiges Objekt in einem
HashSet
, dieser Eintrag ist gespeichert, wie ein Schlüssel in dasHashMap
- die gleichenHashMap
verwendet wird, hinter die Szene derHashSet
. Seit diesem zugrunde liegendenHashMap
braucht einen Schlüssel-Wert-paar, ein dummy-Wert ist, generiert für uns.Nun, wenn Sie versuchen, einen anderen einfügen duplizieren Objekt in der gleichen
HashSet
es wird wieder versucht werden, fügen Sie Sie als Schlüssel in derHashMap
darunter liegen. AllerdingsHashMap
unterstützt keine Duplikate. DaherHashSet
wird dennoch dazu führen, dass nur ein Wert von diesem Typ. Als seitliche Anmerkung, für alle doppelten Schlüssel, da der generierte Wert für unseren Eintrag in der HashSet wird einige random/dummy-Wert, der key wird nicht ersetzt, überhaupt. es wird ignoriert, so entfernen Sie den Schlüssel und das hinzufügen von wieder dem gleichen Schlüssel (die dummy-Wert ist der gleiche), würde keinen Sinn machen überhaupt.Zusammenfassung:
HashMap
ermöglicht doppeltevalues
, aber nichtkeys
.HashSet
keine Duplikate enthält.Spielen mit, ob die Zugabe von ein Objekt erfolgreich abgeschlossen wurde oder nicht, können Sie die
boolean
Wert, der zurückgegeben wird, wenn Sie anrufen.add()
und sehen, ob es gibttrue
oderfalse
. Wenn es wiedertrue
, der es eingefügt wurde.InformationsquelleAutor der Antwort Jimmy
Den docs sind ziemlich klar:
HashSet.add
nicht ersetzen:Aber
HashMap.put
wird ersetzen:InformationsquelleAutor der Antwort pb2q
Es der Fall von HashSet, es ersetzt Sie aber NICHT.
Aus der docs:
http://docs.oracle.com/javase/6/docs/api/java/util/HashSet.html#add(E)
"Fügt das angegebene element an dieses set, wenn es nicht bereits vorhanden ist. Mehr formal, fügt das angegebene element e, dieses set, wenn dieses set enthält kein element e2, so dass (e==null ? e2==null : e.equals(e2)). Wenn dieser Satz enthält bereits das element, wird der Anruf lässt den Satz unverändert und gibt false zurück."
InformationsquelleAutor der Antwort Bob Provencher
Mich korrigieren, wenn ich falsch bin, aber was Sie bekommen, ist, dass mit Streichern, "Hallo" == "Hallo" kommt nicht immer aus wahr (denn Sie sind nicht unbedingt das gleiche Objekt).
Deshalb sind Sie immer eine Antwort von 1, obwohl da die JVM wird die Wiederverwendung von Zeichenketten-Objekten wo dies möglich ist. In diesem Fall ist die JVM wiederverwenden, das string-Objekt, und so überschreiben das Element in der Hashmap/Hashset.
Aber Sie sind nicht garantiert, dieses Verhalten (weil es sein könnte ein anderes string-Objekt, das hat den gleichen Wert "Hi"). Das Verhalten, das Sie sehen, ist nur wegen der JVM-Optimierung.
InformationsquelleAutor der Antwort Nick Rippe
Müssen Sie prüfen, setzen Sie die Methode in der Hash-map zunächst als HashSet ist gesichert durch die HashMap
Werte Hinzugefügt werden in gesetzt, wird der Wert "VORHANDEN", die, wenn der Typ Object)
"ANWESEND" oder null, wenn der Eintrag nicht da ist.
null, andernfalls false, was bedeutet, dass ein Eintrag bereits vorhanden ist...
InformationsquelleAutor der Antwort shiv
Sagen es anders: Wenn Sie beim einfügen eines Schlüssel-Wert-paar in eine HashMap, wo der Schlüssel ist bereits vorhanden (im Sinne hashvalue() gibt den gleichen Wert und die gleiche() ist wahr, aber die beiden Objekte können trotzdem unterscheiden sich auf mehrere weisen), der Schlüssel nicht ersetzt, sondern der Wert wird überschrieben. Der Schlüssel wird nur verwendet, um den hashvalue() und der Wert in der Tabelle mit.
Da HashSet verwendet die keys einer HashMap und setzt willkürliche Werte, die nicht wirklich wichtig (für den Benutzer) als Ergebnis der Elemente der Menge werden nicht ersetzt.
InformationsquelleAutor der Antwort Marco Rothley
HashMap enthält im Grunde Eintrag, der später die Schlüssel enthält(Objekt) und Wert(Objekt).Intern HashSet HashMap sind und HashMap tun ersetzt Werte wie einige von Euch schon..aber ist es wirklich ersetzt die Tasten???Nein ..und das ist der trick hier.HashMap hält seinen Wert als Schlüssel, in der zugrunde liegenden HashMap und Wert ist nur ein dummy-Objekt.Also, wenn u versuchen, erneut mit demselben Wert in HashMap(Key in der zugrunde liegenden Karte).Es ist nur ersetzt die dummy-Wert und nicht den Schlüssel(Wert für HashSet).
Blick auf den folgenden code für die Klasse HashSet:
public boolean [Mehr ...] add(E e) {
Hier e ist der Wert für HashSet, aber Schlüssel für die zugrunde liegende Karte.und der Schlüssel ist, nie ersetzt. Hoffe, ich bin in der Lage, deaktivieren Sie die Verwirrung.
InformationsquelleAutor der Antwort Kunal Kumar