【发布时间】:2015-04-09 13:05:31
【问题描述】:
如果我必须在 HashMap 中为一个键(对于许多键)设置值(如果不存在),那么使用哪个更好。 getOrDefault() 或 putIfAbsent() 因为这两种方法都将返回与键关联的值(如果已设置)。 两者都将键值对作为参数。
【问题讨论】:
-
阅读文档会给你答案
-
尝试一下也能得到答案。
标签: java dictionary
如果我必须在 HashMap 中为一个键(对于许多键)设置值(如果不存在),那么使用哪个更好。 getOrDefault() 或 putIfAbsent() 因为这两种方法都将返回与键关联的值(如果已设置)。 两者都将键值对作为参数。
【问题讨论】:
标签: java dictionary
是的,如果键已设置,它们都会返回与键关联的值,但一个只是 getter 而另一个是 setter。
putIfAbsent
如果指定的键尚未与值关联(或 映射到 null) 将其与给定值关联并返回 null, else 返回当前值。
getOrDefault
返回指定键映射到的值,或 如果此映射不包含键的映射,则为 defaultValue。
如果您的目标只是检索值,请使用getOrDefault。否则,如果要在值不存在时设置,请使用putIfAbsent。
根据你的第一句话,
如果我必须在 HashMap 中为一个键(对于许多键)设置值,如果不是 那么现在哪个更好
你应该使用putIfAbsent。
【讨论】:
在 Java8 中也有 computeIfAbsent,如果存在则返回值,如果不存在,则通过 lambda 函数创建它,将其添加到 Map 并返回其值。
Value v = map.computeIfAbsent(key, k -> new Value(f(k)));
【讨论】:
computeIfAbsent 就像getOrPutDefaultAndGet ?
getOrDefault() 不会改变地图,因此如果您随后检查其内容,您将无法在地图中找到值,例如
HashMap<String, String> map = new HashMap<>();
map.getOrDefault("something", "default"); // returns "default"
assertTrue(map.isEmpty());
putIfAbsent() 确实会改变地图,因此如果您随后检查其内容,您会在地图中找到值,例如
HashMap<String, String> map = new HashMap<>();
map.putIfAbsent("something", "default");
assertFalse(map.isEmpty());
您应该选择适合您需要的那一款。
【讨论】: