java - 为什么 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);
解决方案
阅读文档,即 javadoc getOrDefault()
:
返回指定键映射到的值,或者
defaultValue
如果此映射不包含该键的映射。
如果找不到密钥,它没有说明插入默认值。
因此,如果未找到该键,它会返回该新列表并向其中添加一个元素,但您还需要put()
将该新列表添加到地图中。如果找到了密钥,那么再次放置它不会受到伤害(性能除外)。
但是,这样做的正确方法是使用computeIfAbsent()
,原因有两个:
它将为您放置新列表。
如果密钥存在,它不会创建一个列表只是为了再次将其丢弃。
hmap.computeIfAbsent(key, k -> new ArrayList<>())
.add(s);
推荐阅读
- java - 是否可以将 if 代码连接到流程图(Java)中的 else 代码?
- flutter - 检测到鼠标时如何使PageView允许滚动
- php - 如何在页面加载时清除浏览器缓存
- c++ - 布尔几何的射线到八叉树交点
- c# - 是否可以在捕获流中显示视频人脸检测?
- amazon-web-services - 运行引导 shell 脚本在 ec2 上安装 apache:“没有这样的文件或目录”
- sql - 如何在 BigQuery 中将整数数组转换为一种热编码?
- node.js - 如何将 google 用户与我的收藏中的文档关联起来?
- python - 打开文本文件时如何解决 SyntaxError: (unicode error)?
- git - 在同一设备上使用两个 GitHub 帐户:`致命:无法从远程存储库中读取`