我正在阅读有关 hashmap 的工作原理。我正在阅读 "What will happen if two different objects have same hashcode" .
根据它,如果两个对象具有相同的哈希码,两者都将存储在 LinkedList
但据我所知,如果两个哈希码,那么前一个哈希码将被新的覆盖(如果我错了,请纠正我)。
有人可以详细说明一下 hashmap 如何在内部使用对象作为键,如果两个对象具有相同的 hashcode 会发生什么,以及如何使用 get()
获取这两个对象?
最佳答案
不,第一个不会因为第二个具有相同的 hashCode
而被覆盖。
只有当它也相等时才会被覆盖(如 equals
所说)。如果没有,这两个值都将保存在链表中。
当获取一个键时,所有具有相同 hashCode
的节点将与提供的键进行比较,直到一个相等,然后返回它的值(使用 equals
方法)。
如果 map 中没有相同的键,你会得到 null
。
如果许多对象具有相同的 hashCode(或者更准确地说是相同的 hashCode 以内部 Entry[] 表
的大小为模),那么唯一的问题是总是会读取链表,这更慢(并且破坏了任何哈希表的目的)。这就是为什么在设计 hashcode
方法以确保生成的整数分布良好时很重要的原因。
关于java HashMap 冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14242899/