前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >请问,hashCode 和对象的内存地址有什么关系?我懵了!

请问,hashCode 和对象的内存地址有什么关系?我懵了!

作者头像
用户1263954
发布2021-12-02 09:39:24
7350
发布2021-12-02 09:39:24
举报
文章被收录于专栏:IT技术精选文摘

一道小问题,你能答上来吗?

先看一个最简单的打印

代码语言:javascript
复制
System.out.println(new Object());

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

代码语言:javascript
复制
java.lang.Object@6659c656

那么问题来了:

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

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

代码语言:javascript
复制
Object o = new Object();
int hashcode = o.hashCode();
// toString
System.out.println(o);
// hashcode 十六进制
System.out.println(Integer.toHexString(hashcode));
// hashcode
System.out.println(hashcode);
// 这个方法,也是获取对象的 hashcode;不过和 Object.hashcode 不同的是,该方法会无视重写的hashcode
System.out.println(System.identityHashCode(o));

输出结果:

代码语言:javascript
复制
java.lang.Object@6659c656
6659c656
1717159510
1717159510

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

注:本文内容基于 JAVA 8 HotSpot

代码语言:javascript
复制
Self->_hashStateZ = Self->_hashStateW ;
     unsigned v = Self->_hashStateW ;
     v = (v ^ (v >> 19)) ^ (t ^ (t >> 8)) ;
     Self->_hashStateW = v ;
     value = v ;
  }

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

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

结论

hashCode 可以是内存地址,也可以不是内存地址,甚至可以是 1 这个常数或者自增数!想用什么算法,它都可以!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT技术精选文摘 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一道小问题,你能答上来吗?
  • 结论
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档