java 对于HashMap,使用compute()还是put()更有效

nqwrtyyt  于 2023-06-20  发布在  Java
关注(0)|答案(2)|浏览(173)

我已经试着找了一段时间,但我找不到一个具体的答案,仍然有一些麻烦理解HashMapcompute方法到底做了什么。
目前我的理解是,compute将允许您操作值,但不将其设置为新值(如垃圾收集器必须摆脱旧对象),而put将只是摆脱旧对象并设置它(如x = new Something)。
如果我的理解是错误的,请告诉我,但无论如何,compute方法通常更有效吗?我应该尽可能地在put上使用它,还是只在某些情况下使用它?

relj7zay

relj7zay1#

如果要无条件地设置新值,请使用put。如果要根据Map中的现有值计算新值,请使用compute。您可以选择将其更改为新值或将其从Map中删除。
compute的文档指出:
默认实现等效于为此Map执行以下步骤:

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更复杂:
1.它调用get来检索当前值。
1.它调用提供的重Map函数将其转换为新值。
1.它要么调用put覆盖旧值,要么调用remove删除旧值,具体取决于新值是否为null。
由于最终它会调用put,所以compute的步骤更多,速度也更慢。如果put满足您的需要-您不关心Map中的内容,您只想为值设置一个键-使用put

wko9yo5t

wko9yo5t2#

TL;DR

是的,使用compute而不是get()和put()更有效。

更长版本

通过使用computecomputeIfPresentcomputeIfAbsent等的组合,你可以使用计算方法做与get和put完全相同的事情。* (事实上,在JDK 8之前,没有计算和lambda,但我们都能够在我们的编码生活中没有任何大的漏洞,尽管不可否认,lambda的情况变得更好。
但使用计算方法的主要优点是:
1.它的可读性更强(当然,这取决于是谁在做阅读)
1.它是原子的-在get和put之间,如果你自己写get和put,事情可能会改变。
1.它 * 可以 * 并且 * 通常 * 更有效。如果您查看HashMap.compute方法的源代码,您会发现它只调用了一次哈希函数,这一点很明显。get和put将分别调用hash函数一次,因为底层数据结构知道这些调用是单独的调用。在计算中,它知道put调用“即将到来”,因此它可以保存散列。类似地,在其他实施方式中,一旦已经“定位”了密钥,则将重新使用它,而不是再次查找。这个操作的主要算法成本是在查找中,所以做一次比做两次好。
所以,在2和3之间,有很好的理由使用计算。

相关问题