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);
答案 0 :(得分:10)
阅读文档,即getOrDefault()
的Javadoc:
返回指定键所映射的值;如果此映射不包含该键的映射,则返回
defaultValue
。
如果没有找到密钥,它并没有插入默认值。
因此,如果找不到该键,则它确实会返回该新列表,并向其中添加元素,但是您还需要将该新列表put()
插入地图。如果找到了密钥,则再次放回该密钥不会造成伤害(性能除外)。
但是,这样做的正确方法是使用computeIfAbsent()
,这有两个原因:
它将为您放置新列表。
如果该键存在,它将不会创建列表以仅仅将其丢弃。
hmap.computeIfAbsent(key, k -> new ArrayList<>())
.add(s);
答案 1 :(得分:4)
您要使用HashMap.computeIfAbsent
。 getOrDefault
仅获取值(如果存在),否则将返回默认值而不添加它。
请参见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);