Java HashMap的replace和put之间的区别

Java HashMap的replace和put之间的区别,java,replace,hashmap,Java,Replace,Hashmap,我想用HashMap制作一个柱状图,关键应该是延迟,这个值是延迟发生的次数。如果已经存在的延迟有新的发生,我怀疑是否使用HashMapreplace或HashMapput功能。我是这样做的: int delay = (int) (loopcount-packetServed.getArrivalTime()); if(histogramType1.containsKey(delay)) { histogramType1.replace(delay, histogramType1.get(

我想用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
会得到相同的结果


您可以根据您更容易阅读的内容来使用这两种方法。

当所需密钥存在当前映射时,
put
replace
绝对没有区别。发件人:

仅当指定项当前映射到某个值时,才替换该项

这意味着,如果给定键已经有映射,则
put
replace
将以相同的方式更新映射。两者都将返回与键关联的上一个值。但是,如果该键没有映射,则
replace
将是一个no op(将不执行任何操作),而
put
仍将更新映射


从Java8开始,请注意,您可以使用

histogramType1.merge(delay, 1, Integer::sum);
这将照顾到每一个条件。发件人:

如果指定的键尚未与值关联或与
null
关联,则将其与给定的非null值关联。否则,用给定重新映射函数的结果替换关联的值,如果结果为
null
,则删除该值


在本例中,如果条目不存在,我们将创建条目
delay->1
。如果它确实存在,则通过将值增加1来更新它。

如果查看源,您可以看到以下内容(这是更新11中的内容,但可能没有太大变化):

更换

if ((e = getNode(hash(key), key)) != null) {
    V oldValue = e.value;
    e.value = value;
    afterNodeAccess(e);
    return oldValue;
}    
投入(内部方法投入):


正如您所看到的,代码的相关部分基本上做了相同的事情,因为
onlyfabsent
对于
put
为false,因此总是会替换该值。

您可以通过以下方式验证其他人描述的行为:

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"));
    }
}
公共类主{
公共静态void main(字符串[]args){
Map Map=newhashmap();
地图。替换(“a”、“1”);
System.out.println(map.get(“a”);
地图放置(“a”、“1”);
System.out.println(map.get(“a”);
地图。替换(“a”、“2”);
System.out.println(map.get(“a”);
}
}

“仅当指定键当前映射到某个值时才替换该项”所以我应该保留替换解决方案?在这种情况下,这不重要,因为如果元素存在,它应该与
put
具有相同的结果-因为使用
containsKey
replace
仅在存在映射的情况下调用。我希望键保持不变,但是附加到该键的值应该增加1,我认为使用put函数会导致附加了不同值的键的2倍。不,地图不允许重复键,因此调用
put
而不是
replace
也会导致旧值被删除。
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"));
    }
}