getordefault java,在使用getOrDefault()之后我应该使用put()还是putIfAbsent()?...

Java8 introduced those nice methods getOrDefault() and putIfAbsent(), allowing to write code like:

Map> itemsByFoo = ...

List bars = itemsByFoo.getOrDefault(key, new ArrayList<>());

bars.add(someNewBar);

Now I am wondering if there are good factual reasons to either do:

itemsByFoo.put(key, bars);

or

itemsByFoo.putIfAbsent(key, bars);

Both would work:

option 1 might do a lot of unnecessary "put" calls when adding elements to lists happens often

option2 might do a lot of unnecessary "containsKey" calls when adding new entries for new keys is dominant

SO: are the good reasons to go for option 1 or option 2 "always"?

解决方案

getOrDefault is suitable if you want to use a stand-in for an absent value without modifying the map. If you want to add a new value for absent keys, you can do it right in one operation.

List bars = itemsByFoo.computeIfAbsent(key, x -> new ArrayList<>());

bars.add(someNewBar);

or even

itemsByFoo.computeIfAbsent(key, x -> new ArrayList<>()).add(someNewBar);

In the best case, when being overridden by the Map implementation, like with HashMap, this will bear a single hash lookup only.

Not that putIfAbsent only bears two lookups when using the default implementation, but, of course, most Map implementations will provide a single lookup implementation for it. Still, the combination of getOrDefault and putIfAbsent would still bear two lookups in the best case, whereas an optimized computeIfAbsent does only one.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值