为什么hashmap的值无法使用getOrDefault方法更新?

时间:2019-12-30 20:16:23

标签: java

List<String> list = hmap.getOrDefault(key,new ArrayList<String>());
list.add(s);
hmap.put(key,list);

为什么我需要再次使用hmap.put方法?

我的理解是这样。

假定不存在现有的键值对。因此,使用

List<String> list = hmap.getOrDefault(key,new ArrayList<String>());

我正在将密钥与ArrayList的新实例进行映射。

如果我随后将字符串添加到同一实例,则哈希映射也应该自动更新,对吗?键=>列表对象。如果我将其添加到列表对象,则该对象引用应该不会更改?

为什么我需要再次使用put方法并执行此操作?

hmap.put(key,list);

3 个答案:

答案 0 :(得分:10)

阅读文档,即getOrDefault()的Javadoc:

  

返回指定键所映射的值;如果此映射不包含该键的映射,则返回defaultValue

如果没有找到密钥,它并没有插入默认值。

因此,如果找不到该键,则它确实会返回该新列表,并向其中添加元素,但是您还需要将该新列表put()插入地图。如果找到了密钥,则再次放回该密钥不会造成伤害(性能除外)。

但是,这样做的正确方法是使用computeIfAbsent(),这有两个原因:

  • 它将为您放置新列表。

  • 如果该键存在,它将不会创建列表以仅仅将其丢弃。

hmap.computeIfAbsent(key, k -> new ArrayList<>())
    .add(s);

答案 1 :(得分:4)

您要使用HashMap.computeIfAbsentgetOrDefault仅获取值(如果存在),否则将返回默认值而不添加它。

请参见https://docs.oracle.com/javase/8/docs/api/java/util/Map.html#computeIfAbsent-K-java.util.function.Function-https://docs.oracle.com/javase/8/docs/api/java/util/Map.html#getOrDefault-java.lang.Object-V-

答案 2 :(得分:2)

要一次性完成,必须使用computeIfAbsent

hmap.computeIfAbsent(key, k -> new ArrayList<>()).add(s);