首页 > 解决方案 > 为什么 hashmap 的值没有用 getOrDefault 方法更新?

问题描述

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);

标签: java

解决方案


阅读文档,即 javadoc getOrDefault()

返回指定键映射到的值,或者defaultValue如果此映射不包含该键的映射。

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

因此,如果未找到该键,它会返回该新列表并向其中添加一个元素,但您还需要put()将该新列表添加到地图中。如果找到了密钥,那么再次放置它不会受到伤害(性能除外)。

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

  • 它将为您放置新列表。

  • 如果密钥存在,它不会创建一个列表只是为了再次将其丢弃。

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

推荐阅读