对于 class 的对象CheckToString
,当我将对象或objectName.toString()
作为参数提供给System.out.println()
即尝试打印它时,我得到如下输出:
CheckToString@19821f
在这里,“@”之后的文本是 hashCode,它由什么组成,覆盖 hashCode() 的最佳实践是什么?
对于 class 的对象CheckToString
,当我将对象或objectName.toString()
作为参数提供给System.out.println()
即尝试打印它时,我得到如下输出:
CheckToString@19821f
在这里,“@”之后的文本是 hashCode,它由什么组成,覆盖 hashCode() 的最佳实践是什么?
这在 Java 文档中
在合理可行的情况下,由 Object 类定义的 hashCode 方法确实为不同的对象返回不同的整数。(这通常通过将对象的内部地址转换为整数来实现,但 JavaTM 编程语言不需要这种实现技术。)
你会发现这个链接很有用http://www.jusfortechies.com/java/core-java/hashcode.php
按照规范,哈希码和内存位置之间没有关系。然而,对象的内存地址对于哈希码来说可能是一个很好的(如果不是更好的话)值。
hashCode 的一般合约是:
每当在 Java 应用程序执行期间对同一个对象多次调用它时,hashCode 方法必须始终返回相同的整数,前提是没有修改对象上的 equals 比较中使用的信息。该整数不需要从应用程序的一次执行到同一应用程序的另一次执行保持一致。如果两个对象根据 equals(Object) 方法相等,则对两个对象中的每一个调用 hashCode 方法必须产生相同的整数结果。如果根据 equals(java.lang.Object) 方法,如果两个对象不相等,则不需要对两个对象中的每一个调用 hashCode 方法都必须产生不同的整数结果。然而,
正如 Javadoc 指定的那样。哈希码只不过是整数转换的内部地址。
在合理可行的情况下,由 Object 类定义的 hashCode 方法确实为不同的对象返回不同的整数。(这通常通过将对象的内部地址转换为整数来实现,但 JavaTM 编程语言不需要这种实现技术。)
http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#hashCode()
在java.lang.Object
的哈希码中,它基本上返回内存地址。(32 位十六进制)。
what is the best practice of overriding hashCode()?
当您开始使用集合时,您有时会希望将一个对象与另一个对象匹配。您可能知道两个不同的对象不能相同,但通过覆盖hashcode()
,equals()
您可以进行比较。