Java Object.hashCode() - 地址还是随机()?

joh*_*ode 24 java

我正在尝试理解该hashCode()方法的本机实现.这种方法到底是什么回归?它是一个内存地址还是一个随机值?

bsi*_*nau 38

.hashCode() 本机实现依赖于JVM.

例如,HotSpot有6个Object.hashCode()实现.您可以使用-XX:hashCode=n通过命令行运行JVM的标志来选择它,其中n:

0 - Park-Miller RNG(默认值)
1 - f(地址,global_statement)
2 - 常量1
3 - 串行计数器
4 - 对象地址
5 - 线程局部Xorshift

  • 值得注意的是,由于在对象头中存储内容的空间有限,因此默认哈希码仅为[25位宽](/sf/ask/1845003051/ object-header),而不是int的完整32位. (3认同)

Jon*_*eet 22

文档:

尽可能合理,Object类定义的hashCode方法确实为不同的对象返回不同的整数.(这通常通过将对象的内部地址转换为整数来实现,但Java TM编程语言不需要此实现技术.)

因此它可能与内存地址有关,但它不一定是 - 并且你绝对不应该假设它与内存有关.

你用哈希码做什么都不应该关心这一点.您应该从哈希码中推断出的唯一内容是:

  • 如果两个对象的哈希码相同,则它们可以是相等的对象
  • 如果两个对象的哈希码不同,则它们不是相等的对象(假设正确的实现,是否被覆盖)

  • @millimoose:面对压缩GC,它绝对不能成为*当前*内存地址.但它可能是"第一次通话时的地址,然后可能会被记住".我尽量不要太在意:) (5认同)
  • @GaborSch第一个:哈希码不保证是唯一的.第二:实现可能并不真正用于"真正的"VM,因为它仍然存在哈希码在(相对较小的)Eden Space中的地址. (2认同)