我有两个对象,来自同一类的 o1 和 o2。
如果o1.hashcode() == o2.hashcode()
,我可以告诉它们是同一个对象吗?
另外o1==o2
,有没有其他方法可以告诉单例。
如果您有该类的单个实例,则==
和equals
比较将始终返回true
。
但是,hashcode
对于不同的对象, 可以相等,因此仅通过具有相等的哈希码并不能保证相等。
这是对hashcode
和equals
合同的一个很好的解释。
检查相等性并不足以确保您有一个单例,只有实例被认为是相等的。
如果你想拥有一个 java 类的单个实例,最好使用静态成员和方法。
在这里,演示了几种处理单例的方法。
编辑:正如 emory 所指出的 - 实际上,您可以覆盖equals
以返回随机的东西,从而违反所需的反身性(x.equals(x) == true
)。由于您无法在 java 中覆盖运算符,==
因此这是确定相同对象的唯一可靠方法。
不,不同的对象可以有相同的hashCode()
:
"hypoplankton".hashCode()
"unheavenly" .hashCode()
两者都返回相同的427589249
哈希值,但它们显然不相等。
您的问题(来自标题)似乎是“将hashCode()
始终为同一个对象返回相同的值”......答案是否定的。
实现可以自由地返回任何东西,尽管为了表现良好,它应该为同一个对象返回相同的值。例如,这是一个有效但很差的实现:
@Override
public int hashCode() {
return (int) (Math.random() * Integer.MAX_VALUE);
}
hashCode的一般合同如下所述(Effective Java,第 92 页)。第 3 项表示在不相等的对象上调用 hashCode() 结果不需要唯一。