当前位置: 首页 > 面试题库 >

使用getOrDefault()之后应该使用put()还是putIfAbsent()?

叶华皓
2023-03-14
问题内容

Java8引入了这些不错的方法getOrDefault()putIfAbsent(),从而允许编写如下html" target="_blank">代码:

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可能会进行很多不必要的“ put”调用
  • 选项2可能做了很多不必要的“的containsKey”呼叫时 对新的密钥添加新条目 是主导

SO:“总是”选择选项1或选项2的充分理由是吗?


问题答案:

getOrDefault如果您想对替代值使用缺席值而不修改地图,则适用。如果要为不存在的键添加新值,则可以一次完成操作。

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确实只有一个。



 类似资料:
  • 问题内容: 我正在使用c / c 为osx和linux开发命令行界面可执行文件。该项目将链接到opencv。我应该使用libc 还是libstdc ++? 问题答案: 我会为每个操作系统使用本机库,即GNU / Linux上的libstdc 和Mac OS X上的libc 。 libc 在GNU / Linux上不是100%完整的,而libstdc 更完整时使用libc并没有真正的优势。另外,如果

  • 问题内容: 和CSS 和有什么不一样?我应该使用哪一个?为什么? 问题答案: 所有这些答案似乎都是不正确的。与直觉相反,在CSS 中不是pixel 。至少不是在简单的物理意义上。 从W3C,EM,PX,PT,CM,IN…阅读本文,了解如何为CSS发明一个“神奇的”单元。的含义因硬件和分辨率而异。(该文章是最新的,最新更新为2014-10。) 我自己的思考方式: px单位是CSS的魔术单位。它与当前

  • 问题内容: 我正在一个将Angular和Underscore都作为依赖项的项目。 当我需要创建对象的副本时,根据当时的心情,我可以使用或 在我看来,这些方法中的一种可能比另一种更快速/可靠/健壮。 假设已经包含两个库,那么这两个函数中的任何一个是否存在使另一个函数更好或更坏使用的已知问题? 问题答案: 关于您的问题: angular.copy和_.clone是不同的。这不是哪个更好的问题,而是关于

  • 问题内容: 我想从文本文件中读取每一行并将它们存储在ArrayList中(每一行是ArrayList中的一项)。 到目前为止,我知道BufferedInputStream写入缓冲区,并且仅在缓冲区为空时才进行另一次读取,这可以最大程度地减少或至少减少操作系统的操作量。 我正确吗-我说得通吗? 如果以上情况是在任何情况下,任何人都想使用DataInputStream。最后,我应该使用这两个中的哪一个

  • 问题内容: 在numpy中,可以使用切片语法中的’newaxis’对象创建长度为1的轴,例如: 该文档的状态是一个也可以用代替,效果是完全一样的。 有什么理由选择一个?是否有一般偏好或样式指南?我的印象是更受欢迎,可能是因为它更明确。那么,有什么理由允许这样做? 问题答案: 之所以被允许,是因为它仅仅是的别名。 作者之所以选择它,是因为他们需要一个方便的常量并且可用。 至于为什么你应该更喜欢过:主

  • 问题内容: 在使用SciPy的和NumPy的一个项目,我应该使用,或? 问题答案: 所以没关系,它们都是相同的值。 这三个模块均提供值的唯一原因是,如果仅使用三个模块之一,则可以方便地访问pi,而无需导入另一个模块。他们没有为pi提供不同的值。