java identityHashCode 和 hashCode
2024-09-06 15:11:59
当类并没有重写Object#hashCode()时, 对于 System.identityHashCode(Object) 和 Object#hashCode() 的结果是一致的;
但对于类似String这些重写了Object#hashCode()的类时,当直接调用hashCode()时,由于重载的存在,因此调用的是子类中的方法;
对于这种情况,当我们需要获取对象的hashCode时
- 方法一:我们可以使用 System.identityHashCode(Object) 来直接获取对象的hashCode
- 方法二:可以通过MethodHandle 来调用被子类重载的父级的方法
public void identityHashCodeVsHashCode() throws Throwable {
Object o = new Object();
// 对于Object对象 而言;System.identityHashCode 和 Object#hashCode是相同的
assert System.identityHashCode(o) == o.hashCode();
// 对于 s1 和 s2 实际都是引用的 META区域中相同的对象
String s1 = "1";
String s2 = "1";
assert System.identityHashCode(s1) == System.identityHashCode(s2); String s3 = new String("1");
assert s1.hashCode() == s3.hashCode();
// 对于s1 和 s3 实际是两个不同的对象, 但由于 String重写了Object#hashCode()
// 当需要对比对象时,我们并不能直接调用到Object#hashCode(),因此只能通过System.identityHashCode来获取对象的hashcode
assert System.identityHashCode(s1) != System.identityHashCode(s3);
// 获取指定类的构造方法并执行
Object object = MethodHandles.lookup().findConstructor(Object.class, MethodType.methodType(void.class)).invoke();
// 获取指定类的方法并绑定指定的对象
MethodHandle methodHandle = MethodHandles.lookup().findVirtual(Object.class, "hashCode", MethodType.methodType(int.class)).bindTo(s3);
Object invoke = methodHandle.invoke();
System.out.println((int)invoke);
assert (int)invoke == System.identityHashCode(s3);
}
最新文章
- React Native教程 - 调用Web API
- SharePoint 2013 Pop-Up Dialogs
- Hibernate 的*.hbm.xml文件的填写技巧
- [转] Maven镜像配置
- membership source code
- javascript外部ファイル
- mac xmind快捷键
- 后台如何解析json
- 一天搞定CSS:文本text--05
- 【tool】部署前端工具
- 一个for实现9*9乘法表
- eclipse汉化包
- UART、SPI和I2C详解
- 数字提取——C语言
- Postman 测试swagger类接口技巧
- PixelMatorPro快捷键大全(osx)
- 升级到Sharepoint 2013后页面打开速度慢
- Flexbox兼容性
- java 数据库索引的注意事项
- C#操作Excel文件(转)
热门文章
- 解决MySql Access denied for user 'root'@'192.168.1.119' to databse 的问题
- hook框架-frida简单使用模板以及frida相关接口
- 初识ABP vNext(5):ABP扩展实体
- mysql索引类型:FULLTEXT、NORMAL、SPATIAL、UNIQUE的区别
- GPU虚拟机创建时间深度优化
- 8.深入k8s:资源控制Qos和eviction及其源码分析
- WebApis中BOM的学习
- redis的集群搭建(很详细很详细)
- 2020最新Servlet+form表单实现文件上传(图片)
- oeasy教您玩转linux010107那啥在哪 whereis