当我们将键值对放入 HashMap 时,可能会发生两个键的哈希码相同的情况,那么在这种情况下如何处理键值的存储和检索。
更新
到目前为止我的理解是,如果两个对象键具有相同的哈希码,那么两个键对象都将存储在同一个存储桶中,当我要说get(key)
的时候,在两个具有匹配哈希码的对象中,要获取的元素由object.equals()
.
当您想从 hashmap 中检索某个对象并且存在多个具有相同 hashcode 的对象时,java 将调用equals()
以确定正确的对象。
这就是为什么在覆盖equals()
时覆盖如此重要的原因hashCode()
。
每个桶由一个链表表示,因此除了堆空间之外,桶中的条目数没有限制。桶比可能的 hashCode 结果少,因此多个哈希码映射到同一个桶,而不仅仅是具有相同 hashCode 的键。
有hashCode()
很多冲突的 HashMap 或者桶太少的 HashMap 会使一些链表变长。良好的性能取决于短链表,因为查找的最后阶段是对其中一个链表进行线性扫描。
我同意前面的答案,即匹配取决于equals()
和hashCode()
。