“hashCode”的默认实现是什么?

70
如果一个类没有重写hashCode方法,那么默认实现的hashCode是什么?

关于默认实现,您可以阅读这篇文章 - CAMOBAP
1
默认实现是JVM特定的,但通常它返回return Objects.hash(this.field1, this.field2, this.field3, etc.); - NoName
3个回答

57
这个类从其祖先之一继承了 hashCode。如果没有一个祖先重写它,那么将使用 Object.hashCode
docs 中得知:

尽可能实际,由 Object 类定义的 hashCode 方法确实为不同的对象返回不同的整数。(通常通过将对象的内部地址转换为整数来实现,但是这种实现技术并非 JavaTM 编程语言所必需的。)

因此默认实现取决于 JVM。

谢谢,是的。Object.hashCode() 的实现看起来像什么? - John Threepwood
1
@JohnThreepwood 这是一个实现细节,你需要查阅你的JVM文档来解决这个问题。 - default locale
3
https://dev59.com/H3E95IYBdhLWcg3wmvKh#32454673 - so-random-dude

16
默认情况下,未重写的方法将从Object继承。如果查看该方法的文档,返回值为“[...]独特的整数对于不同的对象。(这通常是通过将对象的内部地址转换为整数来实现[...])”java.lang.Object中的方法声明为本地方法,这意味着实现由JVM提供,并且可能会根据您的运行时环境而有所不同。一个小例子:
Object o1 = new Object();
Object o2 = new Object();
System.out.println(o1.hashCode());
System.out.println(o2.hashCode());

打印输出(使用我的jdk6):

1660187542
516992923

顺便提一下,默认实现toString()使用hashCode()值的十六进制表示法:运行System.out.println(o1)会打印出类似于以下内容:
java.lang.Object@7a5e1077

7

Object.hashcode()是一个本地方法。

public native int hashCode();

这意味着它是在特定平台的代码中实现的,并作为本地方法公开。

相应的代码将是编译后的代码,不会在JDK中提供。

这个现有问题可能会提供更多信息。


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