我有两个对象,o1和o2来自同一个类。
如果o1.hashcode() == o2.hashcode()
,我可以告诉他们是同一个对象吗?
除了o1==o2
之外,还有其他任何方法可以告诉单身人士。
答案 0 :(得分:3)
如果您有一个班级的实例,则==
和equals
比较将始终返回true
。
但是,hashcode
对于不同的对象可以是相同的,因此只能通过具有相同的哈希码来保证相等。
Here是对hashcode
和equals
合同的一个很好的解释。
检查相等性是不足以确保您有单例,只是认为实例相等。
如果您想拥有一个java类的单个实例,那么最好使用静态成员和方法。
Here,展示了几种单身人士的方法。
编辑:正如emory所指出的那样 - 你实际上可以覆盖equals
来随机返回一些东西,从而违反了所需的反身性(x.equals(x) == true
)。由于您无法覆盖java中的运算符,==
是确定相同对象的唯一可靠方法。
答案 1 :(得分:2)
不,不同的对象可以具有相同的hashCode()
:
"hypoplankton".hashCode()
"unheavenly" .hashCode()
返回相同的427589249
哈希值,但它们显然不相等。
答案 2 :(得分:1)
您的问题(来自标题)似乎是" hashCode()
将始终为同一对象返回相同的值" ...答案是否。
该实现可以随意返回任何内容,但为了表现良好,应该为同一个对象返回相同的内容。例如,这是一个有效的,虽然很差的实现:
@Override
public int hashCode() {
return (int) (Math.random() * Integer.MAX_VALUE);
}