Java 8 Map中的putIfAbsent和computeIfAbsent有什么区别?
他们读了一篇有趣的文章,声称这两个功能之间的区别是:
如果Map中尚未存在指定的Key,则两个函数都希望添加一个元素。
putIfAbsent添加具有指定值的元素,而computeIfAbsent添加具有使用键计算的值的元素。
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/
我还没准备好理解有什么区别,请您进一步详细说明这两个功能?
-
差异1
computeIfAbsent
采用映射函数,如果缺少键,则调用该函数以获取值。putIfAbsent
直接取值。如果获取该值很昂贵,那么
putIfAbsent
如果密钥已经存在,那就浪费了。常见的“昂贵”值例如
new ArrayList<>()
用于创建时Map<K, List<V>>
,其中在键已经存在时创建新列表(然后丢弃新列表)会产生不必要的垃圾。
差异#2
computeIfAbsent
返回“与指定键关联的当前(现有或计算得出的)值,如果计算出的值为null,则返回null”。putIfAbsent
返回“与指定键关联的先前值;如果键没有映射,则返回null”。因此,如果键已经存在,则它们返回相同的值,但是如果键丢失,则
computeIfAbsent
返回计算值,而putIfAbsent
返回null。
差异#3
两种方法都将“缺少”定义为缺少键或现有值为null,但是:
computeIfAbsent
如果不存在该键,则不会放置null值。putIfAbsent
即使缺少键,也将放置该值。以后对
computeIfAbsent
,putIfAbsent
和的get
调用没有区别,但对像getOrDefault
和的调用却有区别containsKey
。