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:当我们放置相同的键时地图如何工作[重复]的主要内容,如果未能解决你的问题,请参考以下文章