Java 如果两个对象hashcode是相同的,为什么不意味着o1.等于(o2)?
Java 如果两个对象hashcode是相同的,为什么不意味着o1.等于(o2)?,java,equals,hashcode,Java,Equals,Hashcode,equals()和hashCode()的实现应该遵循这些规则 如果o1.equals(o2),则o1.hashCode()==o2.hashCode()应始终为真 如果o1.hashCode()==o2.hashCode()为真,并不意味着o1.equals(o2)为真 如果o1.hashCode()==o2.hashCode()为真。我知道,如果两个对象相等,那么这两个对象应该返回相同的哈希代码。如果两个对象的哈希代码相同,为什么不意味着o1.equals(o2)?考虑Long。此类型有2^6
equals()
和hashCode()
的实现应该遵循这些规则
o1.equals(o2)
,则o1.hashCode()==o2.hashCode()
应始终为真o1.hashCode()==o2.hashCode()
为真,并不意味着o1.equals(o2)
为真如果
o1.hashCode()==o2.hashCode()
为真。我知道,如果两个对象相等,那么这两个对象应该返回相同的哈希代码。如果两个对象的哈希代码相同,为什么不意味着o1.equals(o2)
?考虑Long
。此类型有2^64个可能的值hashCode
返回一个int
,它只有2^32个可能的值
对于标识哈希代码(可从
System.identityHashCode
获得),对象在许多现代JVM实现的内存中移动。没有合理的方法来跟踪哪些哈希代码仍在使用。即使使用(线程安全)计数器,分配2^32次后,也需要某种形式的重用。哈希函数(线索在名称中)的目的是返回在不同对象的范围内均匀分布的值。不为每个对象返回不同的值
这意味着哈希函数通常有冲突。尽管理想情况下,它们的数量应该尽可能小。想象一个如下的哈希算法(不一定是好的)
对于其余的问题,我建议你通读这个问题的第一个答案,因为所有叫“Rezo”的人都不是你。正确的说法是“不是所有叫“Rezo”的人都是你”。我们有经验证据表明,至少其中一个是哈希代码不是唯一的?如果o1和o2对象的哈希代码相等,这意味着什么?两个对象可以有相同的哈希代码吗?实际上所有对象都可以有相同的哈希代码,这将是一个合法的哈希函数。但不太实用。@Andres有一个选项可以构建HotSpot,使每个标识哈希代码都是1-用于调试目的。