singleton意味着hashcode总是返回相同的吗?

时间:2012-10-20 10:35:55

标签: java equals hashcode

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

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

除了o1==o2之外,还有其他任何方法可以告诉单身人士。

3 个答案:

答案 0 :(得分:3)

如果您有一个班级的实例,则==equals比较将始终返回true

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

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

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

如果您想拥有一个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);
}