2

我有两个对象,来自同一类的 o1 和 o2。

如果o1.hashcode() == o2.hashcode(),我可以告诉它们是同一个对象吗?

另外o1==o2,有没有其他方法可以告诉单例。

4

4 回答 4

4

如果您有该类的单个实例,则==equals比较将始终返回true

但是,hashcode对于不同的对象, 可以相等,因此仅通过具有相等的哈希码并不能保证相等。

是对hashcodeequals合同的一个很好的解释。

检查相等性并不足以确保您有一个单例,只有实例被认为是相等的。

如果你想拥有一个 java 类的单个实例,最好使用静态成员和方法。

在这里,演示了几种处理单例的方法。

编辑:正如 emory 所指出的 - 实际上,您可以覆盖equals以返回随机的东西,从而违反所需的反身性(x.equals(x) == true)。由于您无法在 java 中覆盖运算符,== 因此这是确定相同对象的唯一可靠方法。

于 2012-10-20T10:38:12.730 回答
3

不,不同的对象可以有相同的hashCode()

"hypoplankton".hashCode()
"unheavenly"  .hashCode()

两者都返回相同的427589249哈希值,但它们显然不相等。

于 2012-10-20T10:44:52.140 回答
2

您的问题(来自标题)似乎是“将hashCode()始终为同一个对象返回相同的值”......答案是否定的。

实现可以自由地返回任何东西,尽管为了表现良好,它应该为同一个对象返回相同的值。例如,这是一个有效但很差的实现:

@Override
public int hashCode() {
    return (int) (Math.random() * Integer.MAX_VALUE);
}    
于 2012-10-20T10:51:24.577 回答
0

hashCode的一般合同如下所述(Effective Java,第 92 页)。第 3 项表示在不相等的对象上调用 hashCode() 结果不需要唯一。

  1. 在同一个程序中,hashCode() 的结果不能改变
  2. 如果使用两个对象调用 equals() 返回 true,则对这些对象中的每一个调用 hashCode() 必须返回相同的结果
  3. 如果使用两个对象调用 equals() 返回 false,则对这些对象中的每一个调用 hashCode() 不必返回不同的结果
于 2020-01-07T16:11:32.690 回答