gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 21:01:02 26 4
gpt4 key购买 nike

Java8 引入了那些不错的方法 getOrDefault()putIfAbsent(),允许编写如下代码:

Map<Foo, List<Bar>> itemsByFoo = ...
List<Bar> bars = itemsByFoo.getOrDefault(key, new ArrayList<>());
bars.add(someNewBar);

现在我想知道是否有充分的事实理由:

itemsByFoo.put(key, bars);

itemsByFoo.putIfAbsent(key, bars);

两者都可以:

  • 向列表添加元素时,选项 1 可能会做很多不必要的“放置”调用
  • 为新键添加新条目占主导地位时,option2 可能会执行很多不必要的“containsKey”调用

那么:“总是”选择选项 1 或选项 2 的充分理由是什么?

最佳答案

getOrDefault 适用于在不修改 map 的情况下使用缺失值的替代方法。如果您想为缺少的键添加一个新值,您可以在一次操作中完成。

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

甚至

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

在最好的情况下,当被 Map 实现覆盖时,就像 HashMap 一样,这将只进行一次散列查找。

并不是说 putIfAbsent 在使用 default 实现时只进行两次查找,当然,大多数 Map 实现将提供一次查找它的实现。尽管如此,getOrDefaultputIfAbsent 的组合在最好的情况下仍会进行两次查找,而优化的 computeIfAbsent 只进行一次。

关于java - 我应该在使用 getOrDefault() 之后使用 put() 还是 putIfAbsent()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45459014/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com