Unterschied zwischen replace und put für HashMap

8

Ich möchte ein Histogramm erstellen, indem ich HashMap verwende, der Schlüssel sollte die Verzögerung sein, der Wert die Häufigkeit, mit der diese Verzögerung auftritt. Ich zweifle daran, die Funktion HashMap replace oder HashMap put zu verwenden, wenn eine bereits existierende Verzögerung ein neues Vorkommen hat.

Ich habe es auf diese Weise gemacht

%Vor%

Stimmt das? oder sollte ich die Put-Funktion zweimal benutzen?

    
StudentX 09.02.2016, 16:47
quelle

4 Antworten

11

Es besteht absolut kein Unterschied in put und replace , wenn eine aktuelle Zuordnung für den gewünschten Schlüssel vorhanden ist. Von replace :

  

Ersetzt den Eintrag für den angegebenen Schlüssel nur, wenn er derzeit einem Wert zugeordnet ist.

Dies bedeutet, dass, wenn bereits eine Zuordnung für den gegebenen Schlüssel vorhanden ist, sowohl put als auch replace die Karte auf die gleiche Weise aktualisieren. Beide geben auch den vorherigen Wert zurück, der dem Schlüssel zugeordnet ist. Wenn es für diesen Schlüssel jedoch keine Zuordnung gibt, ist replace ein No-Op (wird nichts tun), während put die Map weiterhin aktualisiert.

Beachten Sie, dass Sie ab Java 8 einfach

verwenden können %Vor%

Dies wird sich um jeden Zustand kümmern. Von merge :

  

Wenn der angegebene Schlüssel nicht bereits einem Wert zugeordnet oder mit null verknüpft ist, wird er mit dem angegebenen Wert ungleich null verknüpft. Andernfalls wird der zugeordnete Wert durch die Ergebnisse der angegebenen Neuzuordnungsfunktion ersetzt oder entfernt, wenn das Ergebnis null ist.

In diesem Fall erstellen wir den Eintrag delay -> 1 , wenn der Eintrag nicht existiert. Wenn es vorhanden war, wird es aktualisiert, indem der Wert um 1 erhöht wird.

    
Tunaki 09.02.2016 16:52
quelle
2

Da in Ihrem Fall zuerst überprüft wird, ob der Wert in der Karte enthalten ist, führt die Verwendung von put oder replace zum selben Ergebnis.

Sie können beide verwenden, je nachdem, was für Sie besser lesbar ist.

    
Jean Logeart 09.02.2016 16:51
quelle
1

Wenn Sie sich die Quellen ansehen, können Sie folgendes sehen (das ist von Update 11, hat sich aber wahrscheinlich nicht sehr geändert):

ersetzen :

%Vor%

put (interne Methode putVal):

%Vor%

Wie Sie sehen können, machen die relevanten Teile des Codes im Grunde dasselbe, da onlyIfAbsent für put falsch ist und daher immer den Wert ersetzt.

    
Thomas 09.02.2016 17:00
quelle
0

Sie können das von den anderen beschriebene Verhalten überprüfen:

%Vor%     
EdgeCase 09.02.2016 17:15
quelle

Tags und Links