【发布时间】:2012-07-27 12:55:31
【问题描述】:
我已经坚持了一段时间了,实际上我有 2 个对象,根据我的说法是相同的,我已经覆盖了 hashCode 方法来为两者创建相等的哈希码,仍然当我使用“=”比较它们是否相等时=" 或对象的等号(也使用 "=="),它返回 false 给我,下面的场景应该完全解释:::
1)HashCode-->-626561382 AND 2)HashCode--->-626561382
1)IdentityHashCode-->19640463
2)IdentityHashCode-->22330755
1)Bean1=beans.OrdersBean@daa76e9a AND 2)Bean2=beans.OrdersBean@daa76e9a
Check MySelf for(==)-->false
Check Object's Equals()-->false
请解释一下为什么会这样????
【问题讨论】:
-
但是,每当创建一个新对象时,都会调用 hashCode() 方法,并且由于我已经覆盖了 hashCode() 方法,所以我的 hashCode 应该运行(正是这种情况正在发生)并且作为我们知道 hashCode() 实际上表示对象将在堆上的创建方式和位置,这意味着当 2 个对象的 hashCode 相同时,它们应该指向堆上的同一个实例(第一个),因此,当“==”比较内存引用时,这应该返回true..如果错了请纠正我..!!
-
你错了。哈希码与 == 运算符无关。 == 正在检查引用相等性,hashCode() 方法正在检查实例的 hashCode(但是您已经决定应该计算它),您的哈希码相同的事实仅意味着无论您的 hashCode 方法正在计算两个对象的 hasCode 相同,如果对象的 equals 方法返回 true,则应该这样做。在程序员确定两个对象值相等的任何情况下,equals 方法都应该返回 true。
-
@JonTaylor 根据 JLS7,对于 hashCode; “这通常是通过将对象的内部地址转换为整数来实现的……”;因此,如果 2 个对象的 hashCodes 相等,这意味着它们在内存中的内部地址相等,并且“==”只比较那个,也就是说,如果对象在内存中具有相同的地址,:: 如果错误,请纠正我.. !!
-
您可能在内置实现方面是正确的,尽管我不认为这应该被依赖,因为它可以被覆盖并且正如您在之前的评论中所说的“并且我已经结束了-ridden hashCode() 方法”你确实覆盖了 hascode 方法,所以它不再有它的默认行为。
标签: java hash operators equals hashcode