我对HashMap的理解是否正确?

时间:2015-09-25 06:46:20

标签: java hashmap

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"

如果我错了,请纠正我

1 个答案:

答案 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的哈希码和相等之间的关系。