繁体   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