HashMap使用密钥用户提交生成hashCode。以下可以是两种情况:
1)如果两个键(Object)相同:
例如
hashmap.put(1,"one");
hashmap.put(1,"another one");
现在,最初"一个"将被插入,然后它将被另一个"。
覆盖2)如果两个不同对象的hashCode相同: 例如,如果我有一个5号的桶,我会尝试:
hashmap.put(5,"this is five");
hashmap.put(25,"this is twenty five");
由于hash%(SIZE-1)将指向同一位置,因此将创建LinkedList以将值存储为:
"this is twenty five" -> "this is five"
如果我错了,请纠正我
答案 0 :(得分:1)
您的第一个问题是关于Map
的一般问题。当您使用相同的密钥调用Map
时,.put()
的行为是Map
公共合同的记录部分。无论具体实现如何,任何(合理的)Map
实现都必须以这种方式运行。
您的第二个问题是关于HashMap
的实施; HashMap
如何解决冲突不是其合同的一部分(虽然文档确实描述了行为),因此可以(并且确实)在版本之间进行更改。并非所有Map
实现都依赖于.hashCode()
,并且此类实现无需解决此类冲突。
差异在概念上介于“正确性”和“效率”之间。由于碰撞解决行为不是合同的记录部分,因此可能会随着时间的推移而发生变化。在Java 8 HashMap
使用链表结构(不要与java.util.LinkedList
混淆)之前,从Java 8开始,它们有时使用红黑树结构(不要与{{1混淆)提高效率。
您可能也对my answer to this question感兴趣,它探讨了Object的哈希码和相等之间的关系。