即使在这里有一些答案表明默认实现是基于“内存”的,这也是完全错误的。多年以来,情况并非如此。
在java-8下,您可以执行以下操作:
java -XX:+PrintFlagsFinal | grep hashCode
获取使用的确切算法(
5默认)。
0 == Lehmer random number generator, 1 == "somehow" based on memory address 2 == always 1 3 == increment counter 4 == memory based again ("somehow") 5 == read below默认情况下(
5),它使用的是Marsaglia XOR-Shift算法,与内存无关。
如果这样做,这并不是很难证明的:
System.out.println(new Object().hashCode());
多次,始终在一个新的VM中-您将获得相同的值,因此Marsaglia XOR-Shift以种子(始终相同,除非其他代码不会对其进行更改)开头并由此开始工作。
但是,即使您切换到某些基于内存的hashCode,并且对象可能会四处移动(垃圾回收器调用),如何确保 在 GC移动了该对象 后仍
采用相同的hashCode ?提示:indentityHashCode和Object标头。



