为什么默认的Object.toString()方法包含hashcode?

36
如果您执行以下操作:
System.out.println(someObj.toString());

你可能看到的输出结果是

someObjectClassname@hashcodenumber

我的问题是:为什么会显示hashCode数值?

3个回答

36

对象哈希码是Java中唯一的 标准 标识符,它可以让你区分不同的任意对象。它不一定是唯一的,但相等的对象通常具有相同的哈希码。

默认的 toString() 方法显示对象类和其哈希码,因此您希望能够区分不同的对象实例。由于它还默认用于错误消息中,这样做非常有意义。

更多信息,请参见hashCode()方法的描述。


感谢您的回复。很抱歉问您这个问题,有没有任何说明这个的规范? - Madhu
阅读java.lang.Object上的javadoc注释至少可以解释其中的一部分。 - Erik
嗯,就像我们不得不假设原因一样。但是并没有确切的解释,是吧? - Madhu
我相信这个约定是:对于返回 true 的相等对象,必须返回相同的哈希码。 - Dunes

18

添加有用信息。

一些新手可能会对为什么通过toString()返回的哈希码值与通过hashCode()返回的值不同而感到困惑。这是因为toString()方法返回相同哈希码的十六进制表示形式。

Integer.toHexString(object.hashCode());将返回与object.toString()返回的相同值。


5

根据javadoc所述:

hashCode方法由Object类定义,尽可能地为不同的对象返回不同的整数值。(通常通过将对象的内部地址转换为整数来实现,但JavaTM编程语言并不要求使用此实现技术。)

hashCode出现在对象的字符串表示中,以便您可以将此对象与同一类的其他对象区分开。 这对于调试很有用。


实际上,System.identityHashCode现在使用一个分配的随机数(因为地址远非“稳定”)。 - bestsss

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