栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Java如果未覆盖hashCode(),则对象的哈希码是什么?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java如果未覆盖hashCode(),则对象的哈希码是什么?

在HotSpot JVM中,默认情况下会在第一次调用时生成未重载

Object.hashCode
System.identityHashCode
随机数并将其存储在对象标头中。随后的调用
Object.hashCode
System.identityHashCode
仅从标头中提取此值。默认情况下,它与对象内容或对象位置没有共同点,只有随机数。此行为由
-XX:hashCode=n
HotSpot JVM选项控制,该选项具有以下可能的值:

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

请注意,即使你设置了

-XX:hashCode=4
,hashCode也不会始终指向对象地址。对象可能会在以后移动,但是hashCode将保持不变。此外,对象地址分布不均(如果你的应用程序使用的内存不多,大多数对象将位于彼此附近),因此如果使用此选项,则最终可能会导致哈希表不平衡。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/395125.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号