-2

对于 class 的对象CheckToString,当我将对象或objectName.toString()作为参数提供给System.out.println()即尝试打印它时,我得到如下输出:

CheckToString@19821f

在这里,“@”之后的文本是 hashCode,它由什么组成,覆盖 hashCode() 的最佳实践是什么?

4

5 回答 5

0

它由什么组成

它包含“对象哈希码的无符号十六进制表示”,正如它在Javadoc中所说的那样。

它是否包含对象的内存地址

没有。也记录在案。

覆盖hashCode()的最佳实践是什么?

这也清楚地记录在Javadoc中。

我建议你阅读它。在这里重复一遍是多余的。

于 2013-10-21T09:24:27.623 回答
0

这在 Java 文档中

在合理可行的情况下,由 Object 类定义的 hashCode 方法确实为不同的对象返回不同的整数。(这通常通过将对象的内部地址转换为整数来实现,但 JavaTM 编程语言不需要这种实现技术。)

你会发现这个链接很有用http://www.jusfortechies.com/java/core-java/hashcode.php

于 2013-10-21T09:27:09.917 回答
0

按照规范,哈希码和内存位置之间没有关系。然而,对象的内存地址对于哈希码来说可能是一个很好的(如果不是更好的话)值。

hashCode 的一般合约是:

每当在 Java 应用程序执行期间对同一个对象多次调用它时,hashCode 方法必须始终返回相同的整数,前提是没有修改对象上的 equals 比较中使用的信息。该整数不需要从应用程序的一次执行到同一应用程序的另一次执行保持一致。如果两个对象根据 equals(Object) 方法相等,则对两个对象中的每一个调用 hashCode 方法必须产生相同的整数结果。如果根据 equals(java.lang.Object) 方法,如果两个对象不相等,则不需要对两个对象中的每一个调用 hashCode 方法都必须产生不同的整数结果。然而,

资源

于 2013-10-21T09:27:11.533 回答
0

正如 Javadoc 指定的那样。哈希码只不过是整数转换的内部地址。

在合理可行的情况下,由 Object 类定义的 hashCode 方法确实为不同的对象返回不同的整数。(这通常通过将对象的内部地址转换为整数来实现,但 JavaTM 编程语言不需要这种实现技术。)

http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#hashCode()

于 2013-10-21T09:29:15.753 回答
-1

java.lang.Object的哈希码中,它基本上返回内存地址。(32 位十六进制)。

what is the best practice of overriding hashCode()?

当您开始使用集合时,您有时会希望将一个对象与另一个对象匹配。您可能知道两个不同的对象不能相同,但通过覆盖hashcode()equals()您可以进行比较。

于 2013-10-21T09:28:10.243 回答