对于HashMap,使用compute()还是put()效率更高

Posted

技术标签:

【中文标题】对于HashMap,使用compute()还是put()效率更高【英文标题】:For HashMap, is it more efficient to use compute() or put() 【发布时间】:2022-01-22 13:22:50 【问题描述】:

我已经尝试环顾了一段时间,但找不到具体的答案,并且仍然无法准确理解 HashMapcompute 方法的作用。

我目前的理解是compute 将允许您操作该值但不能将其设置为新值(例如垃圾收集器必须摆脱旧对象的位置),而@987654324 @ 只会删除旧对象并设置它(例如 x = new Something)。

如果我对此的理解是错误的,请告诉我,但无论如何,compute 方法通常更有效吗?我应该尽可能在put 上使用它还是只在某些情况下使用它?

【问题讨论】:

【参考方案1】:

如果您想无条件地设置一个新值,请使用put。如果要根据地图中的现有值计算新值,请使用 compute。您可以选择将其更改为新值或将其从地图中删除。

documentation for compute 声明:

默认实现等价于对该地图执行以下步骤:

V oldValue = map.get(key);
V newValue = remappingFunction.apply(key, oldValue);
if (newValue != null) 
    map.put(key, newValue);
 else if (oldValue != null || map.containsKey(key)) 
    map.remove(key);

return newValue;

比简单的put复杂多了:

    它调用get 来检索当前值。 它调用提供的重映射函数将其转换为新值。 它要么调用put 覆盖旧值,要么调用remove 删除它,具体取决于新值是否为空。

由于最终调用putcompute 有更多的步骤并且更慢。如果put 满足您的需求——您不关心地图中的内容,您只想将键设置为值——使用put

【讨论】:

以上是关于对于HashMap,使用compute()还是put()效率更高的主要内容,如果未能解决你的问题,请参考以下文章

HashMap的使用:putremove和get方法原理

HashMap的使用:putremove和get方法原理

什么是hashMap,初始长度,高并发死锁,java8 hashMap做的性能提升

HashMap使用注意事项

HashMap

HashMap