Ersetzt das Hinzufügen eines doppelten Werts zu einem HashSet/HashMap den vorherigen Wert

Lesezeit: 6 Minuten

Benutzer-Avatar
Anand

Bitte beachten Sie den folgenden Code:

HashSet hs = new HashSet();
hs.add("hi"); -- (1)
hs.add("hi"); -- (2)

hs.size() wird 1 als geben HashSet erlaubt keine Duplikate, daher wird nur ein Element gespeichert.

Ich möchte wissen, ob wir das doppelte Element hinzufügen, ersetzt es dann das vorherige Element oder fügt es einfach nicht hinzu?

Auch, was mit passieren wirdHashMap für denselben Fall?

Im Falle des HashMapersetzt es den alten Wert durch den neuen.

Im Falle des HashSetdas Element wird nicht eingefügt.

  • Nicht sicher, was ich vermisse, aber die Quellcode scheint etwas anderes zu zeigen? Ich sehe, dass sie die Rückseite nicht überprüfen HashMap um zu sehen, ob die key existiert bereits vor dem Aufruf put auf der Unterlage map?

    – mystarrocks

    9. Juni 2014 um 21:36 Uhr


  • @mystarrocks: Der Schlüssel ist das Element der Setund das wird nie durch die ersetzt put() Betrieb.

    – Keppil

    10. Juni 2014 um 15:05 Uhr

  • ah jetzt verstehe ich. Ich verstand, dass der Schlüssel das Element des ist Sethabe es aber gerade gemerkt put() überschreibt nur den Wert, nicht den Schlüssel. In diesem Fall wird derselbe Wert erneut neben den Schlüssel gesetzt, was besser sein kann oder nicht, als zu prüfen, ob der Schlüssel vorhanden ist, und ihn zu setzen. Auf jeden Fall verstehe ich, wie es funktioniert.

    – mystarrocks

    10. Juni 2014 um 20:12 Uhr


  • Nur neugierig, warum HashMap und HashSet sich dafür entscheiden?

    – Helin Wang

    8. Juli 2014 um 17:56 Uhr

  • @HelinWang: Ich glaube nicht, dass es geplant war, ich denke, es ist nur ein Effekt von HashSet umgesetzt in Form von a HashMap. Schwer zu wissen, es sei denn, Sie sind einer der Entwickler der Klassen.

    – Keppil

    9. Juli 2014 um 5:54 Uhr

Benutzer-Avatar
Jimmy

Das erste, was Sie wissen müssen, ist das HashSet verhält sich wie ein Setwas bedeutet, dass Sie Ihr Objekt direkt zu hinzufügen HashSet und es darf keine Duplikate enthalten. Sie fügen Ihren Wert einfach direkt hinzu HashSet.

Jedoch, HashMap ist ein Map Typ. Das heißt, jedes Mal, wenn Sie einen Eintrag hinzufügen, fügen Sie ein Schlüssel-Wert-Paar hinzu.

Im HashMap Sie können doppelte Werte haben, aber keine doppelten Schlüssel. Im HashMap der neue Eintrag ersetzt den alten. Der neueste Eintrag befindet sich in der HashMap.

Link zwischen HashMap und HashSet verstehen:

Denken Sie daran, HashMap kann keine doppelten Schlüssel haben. Hinter den Kulissen HashSet verwendet a HashMap.

Wenn Sie versuchen, ein beliebiges Objekt in a HashSetdieser Eintrag wird tatsächlich als Schlüssel in der gespeichert HashMap – das Gleiche HashMap das wird hinter den Kulissen von verwendet HashSet. Da dies zugrunde liegt HashMap ein Schlüssel-Wert-Paar benötigt, wird für uns ein Dummy-Wert generiert.

Wenn Sie jetzt versuchen, ein anderes doppeltes Objekt in dasselbe einzufügen HashSetwird erneut versucht, ihn als Schlüssel in die einzufügen HashMap darunter liegen. Jedoch, HashMap unterstützt keine Duplikate. Somit, HashSet führt immer noch dazu, dass nur ein Wert dieses Typs vorhanden ist. Nebenbei bemerkt, da der für unseren Eintrag in HashSet generierte Wert ein zufälliger/Dummy-Wert ist, wird der Schlüssel für jeden doppelten Schlüssel überhaupt nicht ersetzt. es wird ignoriert, da das Entfernen des Schlüssels und das Hinzufügen desselben Schlüssels (der Dummy-Wert ist derselbe) überhaupt keinen Sinn machen würde.

Zusammenfassung:

HashMap ermöglicht Duplikate valuesaber nicht keys.
HashSet darf keine Duplikate enthalten.

Um damit zu spielen, ob das Hinzufügen eines Objekts erfolgreich abgeschlossen wurde oder nicht, können Sie das überprüfen boolean Wert, der zurückgegeben wird, wenn Sie anrufen .add() und sehen, ob es zurückkehrt true oder false. Wenn es zurückkam truees wurde eingefügt.

  • HashMap allows duplicate values HashMap ersetzt den alten Wert durch den neuen.

    – Alex78191

    25. Juni 2018 um 16:52 Uhr


Benutzer-Avatar
pb2q

Das Dokumente sind da ziemlich klar: HashSet.add nicht ersetzen:

Fügt das angegebene Element zu dieser Menge hinzu, falls es noch nicht vorhanden ist. Fügt formaler ausgedrückt 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.

Aber HashMap.put Wille ersetzen:

Wenn die Zuordnung zuvor eine Zuordnung für den Schlüssel enthielt, wird der alte Wert ersetzt.

Benutzer-Avatar
Bob Provencher

Im Fall von HashSet ersetzt es es NICHT.

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 formaler ausgedrückt 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.”

Korrigieren Sie mich, wenn ich falsch liege, aber worauf Sie hinauswollen, ist, dass bei Zeichenfolgen “Hi” == “Hi” nicht immer wahr wird (weil es sich nicht unbedingt um dasselbe Objekt handelt).

Der Grund, warum Sie jedoch eine Antwort von 1 erhalten, liegt darin, 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/dem Hashset.

Dieses Verhalten wird Ihnen jedoch nicht garantiert (weil es sich um ein anderes Zeichenfolgenobjekt handeln könnte, das denselben Wert “Hi” hat). Das Verhalten, das Sie sehen, ist nur auf die Optimierung der JVM zurückzuführen.

Benutzer-Avatar
Gemeinschaft

HashMap grundsätzlich enthält Entry die anschließend enthält Key(Object) und Value(Object).Im Inneren HashSet sind HashMap und HashMap Ersetzen Sie Werte, wie einige von Ihnen bereits gesagt 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 HashMap und der Wert ist nur ein Dummy-Objekt. Wenn Sie also versuchen, denselben Wert in HashMap (Schlüssel in der zugrunde liegenden Karte) erneut einzufügen, wird nur der Dummy-Wert und nicht der Schlüssel (Wert für HashSet) ersetzt.

Sehen Sie sich den folgenden Code für die HashSet-Klasse an:

public boolean  [More ...] add(E e) {

   return map.put(e, PRESENT)==null;
}

Hier ist e der Wert für HashSet, aber der Schlüssel für die zugrunde liegende map.and key wird nie ersetzt. Hoffe ich konnte die Verwirrung beseitigen.

Benutzer-Avatar
schiebt

Sie müssen zuerst die Put-Methode in der Hash-Map überprüfen, da HashSet von HashMap gesichert wird

  1. Wenn Sie einen doppelten Wert hinzufügen, sagen Sie eine Zeichenfolge “Eins” in HashSet,
  2. Ein Eintrag (“Eins”, PRESENT) wird in Hashmap eingefügt (für alle Werte, die dem Set hinzugefügt werden, ist der Wert “PRÄSENTIEREN”, was vom Typ Object ist)
  3. Hashmap fügt den Eintrag in Map hinzu und gibt den Wert zurück, der in diesem Fall “PRESENT” oder null ist, wenn der Eintrag nicht vorhanden ist.
  4. Die add-Methode von Hashset gibt dann true zurück, wenn der zurückgegebene Wert von Hashmap gleich null ist, andernfalls false, was bedeutet, dass bereits ein Eintrag vorhanden ist …

1341820cookie-checkErsetzt das Hinzufügen eines doppelten Werts zu einem HashSet/HashMap den vorherigen Wert

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy