getordefault java_Map 的 getOrDefault(),putIfAbsent() 和 computeIfAbsent() 三个方法

假设我们定义下面一个 Map:Map> map = new HashMap<>();

如果我们要放一个元素进去,很多人会这么写:List list = map.get("list1");

if (list == null) {

list = new ArrayList<>();

map.put("list1", list);

}

list.add("A");

实际上从 Java 8 开始,Map 提供了 computeIfAbsent() 方法,我们可以写成一行即可:map.computeIfAbsent("list1", k -> new ArrayList<>()).add("A");

其中变量 k 是 Map 的 key。

是不是很方便?但是除此之外,Map 还有两个方法:getOrDefault() 和 putIfAbsent(),这三个方法都接受 Key 和一个“默认值”作为参数,且返回一个 Value。如果不小心把它们搞混用错了,可能会带来大问题。下面分别介绍下。

▶ V computeIfAbsent(K, Function super K, ? extends V>)

这个方法有两个参数,Key 和一个根据 Key 来产生 Value 的 Function;然后返回一个 Value。

这个方法会检查 Map 中的 Key,如果发现 Key 不存在或者对应的值是 null,则调用 Function 来产生一个值,然后将其放入 Map,最后返回这个值;否则的话返回 Map 已经存在的值。补充:在 ConcurrentHashMap 中,这个方法保证线程安全,且多线程并发执行的情况下,Function 参数只会被调用一次。所以这个方法完全可以代替 DCL(Double Check Lock)写法。

▶ V getOrDefault(Object, V)

这个方法同样检查 Map 中的 Key,如果发现 Key 不存在或者对应的 value 值是 null,则返回第二个参数即默认值。要注意,这个默认值不会放入 Map。所以如果你这样写:Map> map = new HashMap<>();

map.getOrDefault("list1", new ArrayList<>()).add("A");

执行完之后 map 仍然是空的!

▶ V putIfAbsent(K, V)

这个方法的逻辑完全不同,注意它不是一个 get() 方法,而是 put() 方法的变种!这个方法的逻辑是,如果 Key 不存在或者对应的值是 null,则将 Value 设置进去,然后返回 null;否则只返回 Map 当中对应的值,而不做其他操作。

所以显而易见,在最开始的例子中,如果将 computeIfAbsent() 替换成其他两个方法都是错的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值