【问题标题】:Why is the value of hashmap not getting updated with getOrDefault method?为什么 hashmap 的值没有用 getOrDefault 方法更新?
【发布时间】:2019-12-30 20:16:23
【问题描述】:
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);

【问题讨论】:

  • 这个假设是错误的:我正在用 ArrayList 的新实例映射键。.
  • 我认为 getOrDefault 方法的名称很清楚,不是 putting 任何地方。

标签: java


【解决方案1】:

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

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

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

因此,如果未找到该键,它会返回该新列表并且您向其中添加一个元素,但您还需要将该新列表put() 放入映射中。如果找到了密钥,那么再次放置它并没有什么坏处(性能除外)。

不过,正确的做法是使用computeIfAbsent(),原因有两个:

  • 它将为您放置新列表。

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

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

【讨论】:

    【解决方案2】:

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2018-10-15
        • 1970-01-01
        • 2016-06-19
        • 1970-01-01
        • 2018-09-13
        • 1970-01-01
        • 2016-02-24
        • 1970-01-01
        • 2021-03-19
        相关资源
        最近更新 更多