凤来凰科技网

美团面试题:hashCode 和对象的内存地址有什么关系?

凤来凰科技网 3

先看一个最简单的打印

会输出该类的全限定类名和一串字符串:

符号后面的是什么?是 hashcode 还是对象的内存地址?还是其他的什么值?

其实后面的只是对象的 hashcode 值,16进制展示的 hashcode 而已,来验证一下:

输出结果:

那对象的 hashcode 到底是怎么生成的呢?真的就是内存地址吗?

本文内容基于 JAVA 8 HotSpot

hashCode 的生成逻辑

JVM 里生成 hashCode 的逻辑并没有那么简单,它提供了好几种策略,每种策略的生成结果都不同。

来看一下 openjdk 源码里生成 hashCode 的核心方法:

从源码里可以发现,生成策略是由一个 的全变量控制的,默认为5;而这个变量的定义在另一个头文件里:

源码里很清楚了……

(非稳定)选择 hashCode 生成的算法

,而且这里的定义,是可以由 jvm 启动参数来控制的,先来确认下默认值:

所以我们可以通过 jvm 的启动参数来配置不同的 hashcode 生成算法,测试不同算法下的生成结果:

现在来看看,每种 hashcode 生成算法的不同表现。

第 0 种算法

这种生成算法,使用的一种

Park-Miller RNG

的随机数生成策略。不过需要注意的是……这个随机算法在高并发的时候会出现自旋等待

第 1 种算法

这个算法,真的是对象的内存地址了,直接获取对象的 类型指针

第 2 种算法

这个就不用解释了……固定返回 1,应该是用于内的测试场景。

有兴趣的同学,可以试试来开启这个算法,看看 hashCode 结果是不是都变成 1 了。

第 3 种算法

这个算法也很简单,自增嘛,所有对象的 hashCode 都使用这一个自增变量。来试试效果:

果然是自增的……有点意思

第 4 种算法

这里和第 1 种算法其实区别不,都是返回对象地址,只是第 1 种算法是一个变体。

第 5 种算法

最后一种,

也是默认的生成算法

,hashCode 配置不等于 0/1/2/3/4 时使用该算法:

这里是通过当前状态值进行异或(XOR)运算得到的一个 hash 值,相比前面的自增算法和随机算法来说效率更高,但重复率应该也会相对增高,不过 hashCode 重复又有什么关系呢……

本来 jvm 就不保证这个值一定不重复,像 HashMap 里的链地址法就是解决 hash 冲突用的.

最近面试BAT,整理一份面试资料《Java面试BATJ通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。

文章有帮助的话,在看,转发吧。

谢谢支持哟 (*^__^*)

信创cpu芯片公司怎么样

广州通用空调主板报价多少

怎么看显卡被改过显存还是显卡

圆通国际为什么查不到

室内初恋照片怎么拍好

晚上什么软件拍照清晰

摄像的基本功是什么

拍物品好看的相机软件

seo没有电脑基础怎么学

标签:美团 面试