gpt4 book ai didi

java - 如果 hashCode() 没有被覆盖,对象的哈希码是什么?

转载 作者:IT老高 更新时间:2023-10-28 13:53:32 26 4
gpt4 key购买 nike

如果 hashCode() 方法没有被覆盖,那么在 Java 中对任何对象调用 hashCode() 的结果是什么?

最佳答案

在 HotSpot JVM 中,默认情况下,在第一次调用非重载 Object.hashCodeSystem.identityHashCode 时会生成一个随机数并将其存储在对象头中。随后对 Object.hashCodeSystem.identityHashCode 的调用只是从 header 中提取此值。默认情况下,它与对象内容或对象位置没有任何共同之处,只是随机数。此行为由 -XX:hashCode=n HotSpot JVM 选项控制,该选项具有以下可能值:

  • 0:使用全局随机生成器。这是 Java 7 中的默认设置。它的缺点是来自多个线程的并发调用可能会导致竞争条件,这将导致为不同的对象生成相同的 hashCode。此外,在高并发环境中,由于争用(使用来自不同 CPU 内核的相同内存区域),可能会出现延迟。
  • 5:使用一些线程局部异或移位随机生成器,它没有以前的缺点。这是 Java 8 中的默认设置。
  • 1:使用对象指针与一些在“停止世界”事件中更改的随机值混合,因此在停止世界事件(如垃圾收集)之间生成的哈希码是稳定的(用于测试/调试目的)
  • 2:始终使用 1(用于测试/调试目的)
  • 3:使用自动递增数字(出于测试/调试目的,还使用全局计数器,因此可能存在争用和竞争条件)
  • 4:如有必要,使用修剪为 32 位的对象指针(用于测试/调试目的)

请注意,即使您设置了 -XX:hashCode=4,hashCode 也不会总是指向对象地址。对象可以稍后移动,但 hashCode 将保持不变。此外,对象地址分布不均(如果您的应用程序使用的内存不多,大多数对象将彼此靠近),因此如果使用此选项,您最终可能会得到不平衡的哈希表。

关于java - 如果 hashCode() 没有被覆盖,对象的哈希码是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2237720/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com