hashCode()的困境 - Java

4

我有以下代码:

Object testA =  new Object();
Object testB = testA;
System.out.println("A:"+testA.hashCode())
System.out.println("B:"+testB.hashCode())

根据上述内容,我得到了两个对象相同的哈希码。我理解testB被赋予了testA,因此它可以具有相同的哈希码,但是应该有一种方式可以唯一地区别这两个不同的对象,对吧?
如果有明显遗漏的地方,请告诉我!
3个回答

7

然而,应该有一种方法可以唯一地识别这两个对象的区别,对吧?

实际上没有区别,因为这里只有一个对象被两个变量引用。

理论上,两个不同的对象可能具有相同的hashCode。您可以通过使用equals==来区分它们。如果您没有覆盖equals,默认情况下它会像==一样运行。


4
hashCode函数必须与equals方法兼容,也就是说,对于两个相等的对象,hashCode函数必须返回相同的值。在这种情况下,它们不仅“相等”(根据equals方法),甚至是同一个对象(这意味着它们是相等的)。
此外,无论规范要求什么,两次调用hashCode都不可能返回不同的值,因为两个变量实际上引用同一个对象。除了变量名之外,没有办法区分testAtestB

在检查“==”运算符时,它会显示相等。 - Faz
@Faz:hashCode 相关的部分是 equals 方法,而不是 ==。但在这种情况下,两者都会 表示它们相等。 - mastov
你能否添加一个Java文档或其他内容的引用,说明如果equals方法返回true,则期望hashcode相同? - Codebender
@AbishekManoharan:已添加。 - mastov

1
你创建了一个新对象testA,但随后将testB赋值给testA,这会为两个对象分配相同的内存空间。这就是为什么它返回相同的HashCode的原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接