Java HashMap的replace和put之间的区别
我想用HashMap制作一个柱状图,关键应该是延迟,这个值是延迟发生的次数。如果已经存在的延迟有新的发生,我怀疑是否使用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
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"));
}
}