【发布时间】:2018-01-09 13:42:59
【问题描述】:
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“总是”的充分理由是什么?
【问题讨论】:
-
咳咳,都没有。整个操作使用
itemsByFoo.computeIfAbsent(key, x -> new ArrayList<>()) .add(someNewBar);。 -
@Holger 是的 :) 好点。因为
putIfAbsent可能会返回null,因为它会返回previous 值...而且computeifAbsent存在于java-8 中,而不是7。我之前遇到过这个问题... -
@Eugene:
putIfAbsent被添加到 Java 8 中的Map接口中,因为现在可以使用default方法,但它必须保持ConcurrentMap.putIfAbsent的合同,这从 Java 5 开始就存在了,所以不如computeIfAbsent... -
在这两种情况下都会调用 putVal 函数并执行以下代码 p = tab[i = (n - 1) & hash 。 p.Key 是键的值。将此键与您提供的要放入 HashMap 的键值进行比较。在这两种情况下 contains 无论如何都称为
标签: java dictionary collections java-8