Hashmap:当我们放置相同的键时地图如何工作[重复]

Posted

技术标签:

【中文标题】Hashmap:当我们放置相同的键时地图如何工作[重复]【英文标题】:Hashmap : How map works when we put same key [duplicate] 【发布时间】:2019-11-03 14:23:42 【问题描述】:
Map<String, String> map = new HashMap<String, String>();

我知道地图的内部工作。如果两个键的哈希码相同,就会发生冲突,它将存储在链表中。但是如果再放那把钥匙呢。

对此有任何检查吗?或者它会简单地替换值而不检查?

详细说明

map.put("sparsh", "sparsh");
map.put("sparsh", "1");

它将值“sparsh”替换为“1”

map.put("sparsh", "1");
map.put("sparsh", "1");

上述情况会发生什么情况,是否可以更换?

还有一些与上述问题不同的上下文

System.out.println(map.put("sparsh", "sparsh"));
System.out.println(map.put("sparsh", "1"));

它首先给我“null”,然后是“sparsh”(key)。这背后的原因是什么,如果有人对此有所了解的话。

【问题讨论】:

来自Map.put的javadocs:将指定的值与此映射中的指定键相关联(可选操作)。 如果映射先前包含键的映射,则旧值将替换为指定值返回:与键关联的先前值 , 如果没有 key 映射,则返回 null。 这回答了你的两个问题。 【参考方案1】:

看跌合约为:

当密钥未知时,您添加一个新的键/值对, 当键已知时,您更新(覆盖)现有键/值对的值。

在您的情况下,您无法观察“输入”新值或保留旧值之间的区别。具有两个值的两个字符串总是相等的,因此这并不重要。

但是:您可以轻松地构造一个示例(使用具有两个字段的类),其中两个对象相等,但具有不同的值(因为在equals() 实现)。

因此,新值必须进入地图,即使它等于与已经存在的值相同。

【讨论】:

【参考方案2】:

来自Map::put 的文档:

V put(K key, V value)

返回: 与键关联的前一个值如果存在则返回 null 键没有映射。 (返回 null 也可以表示地图 如果实现支持,则以前将 null 与键关联 空值。)

这是什么意思

当您向地图添加条目时:

如果具有该键的条目存在,则它将返回最后一个值, 否则它将返回 null,就像您在示例中一样。

这是一个包含多个 put 的示例:

System.out.println(map.put("key", "v1")); // null
System.out.println(map.put("key", "v2")); // v1
System.out.println(map.put("key", "v3")); // v2
System.out.println(map.put("key2", "v4")); // null

【讨论】:

【参考方案3】:

java.util.Map.put(key, value) 返回与同一键关联的先前值。

所以最初没有与键关联的值,所以第一个 map.put("sparsh", "sparsh") 返回 null。

那么,既然地图中有key: sparsh, value: sparsh,调用map.put("sparsh", "1")会返回之前的值,就像"sparsh"一样

【讨论】:

我忘了提到那部分,很高兴现在有人这样做了,并且省去了我再次编辑答案的工作;-)

以上是关于Hashmap:当我们放置相同的键时地图如何工作[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何使 HashMap 以数组为键工作?

当每个字典都有不同的键时,如何按值对字典列表进行排序?

当用户从 Vue.js 中的 JSON 对象中选择第一个键时,如何显示剩余的键值?

TreeMap 或 HashMap 更快[重复]

Java的HashMap是如何工作的?

当计算机在我的代码中要求时我没有输入数组中存在的键时,如何打印“数组中不存在键(元素)”