Java 8 Map中的putIfAbsent和computeIfAbsent有什么区别?

发布于 2021-01-30 16:40:04

他们读了一篇有趣的文章,声称这两个功能之间的区别是:

如果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/

我还没准备好理解有什么区别,请您进一步详细说明这两个功能?

关注者
0
被浏览
79
1 个回答
  • 面试哥
    面试哥 2021-01-30
    为面试而生,有面试问题,就找面试哥。

    差异1

    computeIfAbsent 采用映射函数,如果缺少键,则调用该函数以获取值。

    putIfAbsent 直接取值。

    如果获取该值很昂贵,那么putIfAbsent如果密钥已经存在,那就浪费了。

    常见的“昂贵”值例如new ArrayList<>()用于创建时Map<K, List<V>>,其中在键已经存在时创建新列表(然后丢弃新列表)会产生不必要的垃圾。


    差异#2

    computeIfAbsent 返回“与指定键关联的当前(现有或计算得出的)值,如果计算出的值为null,则返回null”。

    putIfAbsent 返回“与指定键关联的先前值;如果键没有映射,则返回null”。

    因此,如果键已经存在,则它们返回相同的值,但是如果键丢失,则computeIfAbsent返回计算值,而putIfAbsent返回null。


    差异#3

    两种方法都将“缺少”定义为缺少键或现有值为null,但是:

    computeIfAbsent 如果不存在该键,则不会放置null值。

    putIfAbsent 即使缺少键,也将放置该值。

    以后对computeIfAbsentputIfAbsent和的get调用没有区别,但对像getOrDefault和的调用却有区别containsKey



推荐阅读
知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看