差异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。



