阅读一篇有趣的文章,这些人声称这两个功能之间的区别是:
如果指定的 Key 不存在于 Map 中,这两个函数都希望添加一个元素。
putIfAbsent 添加一个具有指定 Value 的元素,而 computeIfAbsent 添加一个具有使用 Key 计算的值的元素。 http://www.buggybread.com/2014/10/java-8-difference-between-map.html
和
我们已经看到 putIfAbsent 消除了必须定义 if 语句的命令式方式,但是如果获取 Java 文章真的会损害我们的性能怎么办?
为了优化这一点,我们不想在真正确定我们需要它们之前获取文章——这意味着我们需要在获取文章之前知道密钥是否不存在。 http://www.deadcoderising.com/2017-02-14-java-8-declarative-ways-of-modifying-a-map-using-compute-merge-and-replace/
我还没准备好了解这两个功能有什么区别,您能详细说明一下吗?
原文由 Adelin 发布,翻译遵循 CC BY-SA 4.0 许可协议
差异 #1
computeIfAbsent
接受一个映射函数,如果键丢失,调用它来获取值。putIfAbsent
直接取值。如果获取该值的成本很高,那么
putIfAbsent
如果密钥已经存在,则会浪费它。一个常见的“昂贵”值是例如
new ArrayList<>()
当你创建一个Map<K, List<V>>
时,当键已经存在时创建一个新列表(然后丢弃新列表)会产生不必要的垃圾。差异 #2
computeIfAbsent
返回“与指定键关联的当前(现有或计算)值,如果计算值为空则返回空”。putIfAbsent
返回“与指定键关联的先前值,如果没有键的映射,则返回 null”。所以,如果密钥已经存在,它们返回相同的东西,但如果密钥丢失,
computeIfAbsent
返回计算值,而putIfAbsent
返回空值。差异 #3
这两种方法都将“不存在”定义为缺少键或现有值为空,但是:
computeIfAbsent
如果密钥不存在,则不会输入空值。putIfAbsent
如果键不存在,即使值为空,也会放置值。It makes no difference for future calls to
computeIfAbsent
,putIfAbsent
, andget
calls, but it does make a difference to calls likegetOrDefault
和containsKey
。