[英]Difference between replace and put for HashMap
我想使用HashMap
制作直方圖,關鍵應該是延遲,值是延遲發生的次數。 如果已經存在的延遲有新的發生,我懷疑使用HashMap
replace
或HashMap
put
函數。 我是這樣做的:
int delay = (int) (loopcount-packetServed.getArrivalTime());
if(histogramType1.containsKey(delay)) {
histogramType1.replace(delay, histogramType1.get(delay) + 1);
} else {
histogramType1.put(delay, 1);
}
這樣對嗎? 還是我應該使用兩次 put 函數?
當存在所需鍵的當前映射時, put
和replace
絕對沒有區別。 從replace
:
僅當當前映射到某個值時才替換指定鍵的條目。
這意味着如果給定鍵已經存在映射,則put
和replace
將以相同的方式更新映射。 兩者都將返回與鍵關聯的先前值。 但是,如果該鍵沒有映射,那么replace
將是空操作(什么都不做),而put
仍會更新映射。
從 Java 8 開始,請注意您可以只使用
histogramType1.merge(delay, 1, Integer::sum);
這將照顧每一個條件。 從merge
:
如果指定的鍵尚未與值相關聯或與
null
相關聯,則將其與給定的非空值相關聯。 否則,用給定重映射函數的結果替換關聯值,如果結果為null
則刪除。
在這種情況下,如果條目不存在,我們將創建條目delay -> 1
。 如果確實存在,則通過將值增加 1 來更新它。
在您的情況下,由於您首先檢查該值是否包含在地圖中,因此使用put
或replace
會導致相同的結果。
您可以使用任何一種,具體取決於對您來說更易讀的內容。
如果您查看來源,您可以看到以下內容(來自更新 11,但可能沒有太大變化):
替換:
if ((e = getNode(hash(key), key)) != null) {
V oldValue = e.value;
e.value = value;
afterNodeAccess(e);
return oldValue;
}
put (內部方法 putVal):
//some code before this to find the node e (similar to getNode(hash(key)))
if (e != null) { // existing mapping for key
V oldValue = e.value;
if (!onlyIfAbsent || oldValue == null) //onlyIfAbsent is false here
e.value = value;
afterNodeAccess(e);
return oldValue;
}
如您所見,代碼的相關部分基本上做了相同的事情,因為onlyIfAbsent
對於put
是假的,因此總是會替換該值。
您可以通過以下方式驗證其他人所描述的行為:
public class Main {
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
map.replace("a", "1");
System.out.println(map.get("a"));
map.put("a", "1");
System.out.println(map.get("a"));
map.replace("a", "2");
System.out.println(map.get("a"));
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.