我想使用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函数的两倍?
答案 0 :(得分:24)
当有所需密钥的当前映射时,put
和replace
完全没有区别。来自replace
:
仅当指定键的条目当前映射到某个值时才替换该条目。
这意味着如果已经存在给定密钥的映射,put
和replace
都将以相同的方式更新地图。两者都将返回与键关联的先前值。但是,如果该密钥没有映射,那么replace
将是无操作(无效),而put
仍会更新地图。
从Java 8开始,请注意您可以使用
histogramType1.merge(delay, 1, Integer::sum);
这将照顾每一个条件。来自merge
:
如果指定的键尚未与值关联或与
null
关联,则将其与给定的非空值关联。否则,将相关值替换为给定重映射函数的结果,或者如果结果为null
则删除。
在这种情况下,如果条目不存在,我们将创建条目delay -> 1
。如果确实存在,则通过将值递增1来更新。
答案 1 :(得分:2)
在您的情况下,由于您首先检查地图中是否包含该值,因此使用put
或replace
会导致相同的结果。
您可以根据您的可读性使用其中之一。
答案 2 :(得分:1)
如果您查看来源,您可以看到以下内容(这是来自更新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
是假的,因此总是会替换该值。
答案 3 :(得分:0)
您可以使用以下方法验证其他人描述的行为:
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"));
}
}