当类并没有重写Object#hashCode()时, 对于 System.identityHashCode(Object) 和 Object#hashCode() 的结果是一致的;

但对于类似String这些重写了Object#hashCode()的类时,当直接调用hashCode()时,由于重载的存在,因此调用的是子类中的方法;

对于这种情况,当我们需要获取对象的hashCode时

  1. 方法一:我们可以使用 System.identityHashCode(Object) 来直接获取对象的hashCode
  2. 方法二:可以通过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);
}

  

最新文章

  1. React Native教程 - 调用Web API
  2. SharePoint 2013 Pop-Up Dialogs
  3. Hibernate 的*.hbm.xml文件的填写技巧
  4. [转] Maven镜像配置
  5. membership source code
  6. javascript外部ファイル
  7. mac xmind快捷键
  8. 后台如何解析json
  9. 一天搞定CSS:文本text--05
  10. 【tool】部署前端工具
  11. 一个for实现9*9乘法表
  12. eclipse汉化包
  13. UART、SPI和I2C详解
  14. 数字提取——C语言
  15. Postman 测试swagger类接口技巧
  16. PixelMatorPro快捷键大全(osx)
  17. 升级到Sharepoint 2013后页面打开速度慢
  18. Flexbox兼容性
  19. java 数据库索引的注意事项
  20. C#操作Excel文件(转)

热门文章

  1. 解决MySql Access denied for user 'root'@'192.168.1.119' to databse 的问题
  2. hook框架-frida简单使用模板以及frida相关接口
  3. 初识ABP vNext(5):ABP扩展实体
  4. mysql索引类型:FULLTEXT、NORMAL、SPATIAL、UNIQUE的区别
  5. GPU虚拟机创建时间深度优化
  6. 8.深入k8s:资源控制Qos和eviction及其源码分析
  7. WebApis中BOM的学习
  8. redis的集群搭建(很详细很详细)
  9. 2020最新Servlet+form表单实现文件上传(图片)
  10. oeasy教您玩转linux010107那啥在哪 whereis