[英]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.