簡體   English   中英

HashMap的replace和put的區別

[英]Difference between replace and put for HashMap

我想使用HashMap制作直方圖,關鍵應該是延遲,值是延遲發生的次數。 如果已經存在的延遲有新的發生,我懷疑使用HashMap replaceHashMap put函數。 我是這樣做的:

int delay = (int) (loopcount-packetServed.getArrivalTime());
if(histogramType1.containsKey(delay)) {
    histogramType1.replace(delay, histogramType1.get(delay) + 1);   
} else {
    histogramType1.put(delay, 1);
}

這樣對嗎? 還是我應該使用兩次 put 函數?

當存在所需鍵的當前映射時, putreplace絕對沒有區別。 replace

僅當當前映射到某個值時才替換指定鍵的條目。

這意味着如果給定鍵已經存在映射,則putreplace將以相同的方式更新映射。 兩者都將返回與鍵關聯的先前值。 但是,如果該鍵沒有映射,那么replace將是空操作(什么都不做),而put仍會更新映射。


從 Java 8 開始,請注意您可以只使用

histogramType1.merge(delay, 1, Integer::sum);

這將照顧每一個條件。 merge

如果指定的鍵尚未與值相關聯或與null相關聯,則將其與給定的非空值相關聯。 否則,用給定重映射函數的結果替換關聯值,如果結果為null則刪除。

在這種情況下,如果條目不存在,我們將創建條目delay -> 1 如果確實存在,則通過將值增加 1 來更新它。

在您的情況下,由於您首先檢查該值是否包含在地圖中,因此使用putreplace會導致相同的結果。

您可以使用任何一種,具體取決於對您來說更易讀的內容。

如果您查看來源,您可以看到以下內容(來自更新 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM