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

本文探讨了Java 8中getOrDefault、putIfAbsent和computeIfAbsent方法在处理Map时的使用场景,比较了它们的性能和适用情境,强调了computeIfAbsent在避免额外查找的优点。
摘要由CSDN通过智能技术生成

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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值