我已经试着找了一段时间,但我找不到一个具体的答案,仍然有一些麻烦理解HashMap的compute方法到底做了什么。目前我的理解是,compute将允许您操作值,但不将其设置为新值(如垃圾收集器必须摆脱旧对象),而put将只是摆脱旧对象并设置它(如x = new Something)。如果我的理解是错误的,请告诉我,但无论如何,compute方法通常更有效吗?我应该尽可能地在put上使用它,还是只在某些情况下使用它?
HashMap
compute
put
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。
get
remove
wko9yo5t2#
TL;DR
是的,使用compute而不是get()和put()更有效。
更长版本
通过使用compute,computeIfPresentcomputeIfAbsent等的组合,你可以使用计算方法做与get和put完全相同的事情。* (事实上,在JDK 8之前,没有计算和lambda,但我们都能够在我们的编码生活中没有任何大的漏洞,尽管不可否认,lambda的情况变得更好。但使用计算方法的主要优点是:1.它的可读性更强(当然,这取决于是谁在做阅读)1.它是原子的-在get和put之间,如果你自己写get和put,事情可能会改变。1.它 * 可以 * 并且 * 通常 * 更有效。如果您查看HashMap.compute方法的源代码,您会发现它只调用了一次哈希函数,这一点很明显。get和put将分别调用hash函数一次,因为底层数据结构知道这些调用是单独的调用。在计算中,它知道put调用“即将到来”,因此它可以保存散列。类似地,在其他实施方式中,一旦已经“定位”了密钥,则将重新使用它,而不是再次查找。这个操作的主要算法成本是在查找中,所以做一次比做两次好。所以,在2和3之间,有很好的理由使用计算。
computeIfPresent
computeIfAbsent
2条答案
按热度按时间relj7zay1#
如果要无条件地设置新值,请使用
put
。如果要根据Map中的现有值计算新值,请使用compute
。您可以选择将其更改为新值或将其从Map中删除。compute
的文档指出:默认实现等效于为此Map执行以下步骤:
它比简单的
put
更复杂:1.它调用
get
来检索当前值。1.它调用提供的重Map函数将其转换为新值。
1.它要么调用
put
覆盖旧值,要么调用remove
删除旧值,具体取决于新值是否为null。由于最终它会调用
put
,所以compute
的步骤更多,速度也更慢。如果put
满足您的需要-您不关心Map中的内容,您只想为值设置一个键-使用put
。wko9yo5t2#
TL;DR
是的,使用compute而不是get()和put()更有效。
更长版本
通过使用
compute
,computeIfPresent
computeIfAbsent
等的组合,你可以使用计算方法做与get和put完全相同的事情。* (事实上,在JDK 8之前,没有计算和lambda,但我们都能够在我们的编码生活中没有任何大的漏洞,尽管不可否认,lambda的情况变得更好。但使用计算方法的主要优点是:
1.它的可读性更强(当然,这取决于是谁在做阅读)
1.它是原子的-在get和put之间,如果你自己写get和put,事情可能会改变。
1.它 * 可以 * 并且 * 通常 * 更有效。如果您查看HashMap.compute方法的源代码,您会发现它只调用了一次哈希函数,这一点很明显。get和put将分别调用hash函数一次,因为底层数据结构知道这些调用是单独的调用。在计算中,它知道put调用“即将到来”,因此它可以保存散列。类似地,在其他实施方式中,一旦已经“定位”了密钥,则将重新使用它,而不是再次查找。这个操作的主要算法成本是在查找中,所以做一次比做两次好。
所以,在2和3之间,有很好的理由使用计算。