Java:Object.hashCode()和System.identityHashCode()的区别
今天在看HashMap
源码的时候注意到了这件事:Java源码详解二:HashMap源码分析–openjdk java 11源码
对红黑树中的节点进行排序时,如果hashCode相同,类不是comparable的,那么先判断名字是否相同,相同的话再调用系统的hash方法进行判断:
if (d = a.getClass().getName().compareTo(b.getClass().getName()) == 0)
d = (System.identityHashCode(a) <= System.identityHashCode(b) ?-1 : 1);
这里的代码调用了System.identityHashCode
取对象的哈希值。
如果一个类没有实现自己的hashCode
方法,那么对这个类进行hashCode
调用的是Object.hashCode()
,也就是调用了:
System.identityHashCode(this)
identityHashCode的实现源码:
/*** Returns the same hash code for the given object as* would be returned by the default method hashCode(),* whether or not the given object's class overrides* hashCode().* The hash code for the null reference is zero.** @param x object for which the hashCode is to be calculated* @return the hashCode* @since 1.1* @see Object#hashCode* @see java.util.Objects#hashCode(Object)*/@HotSpotIntrinsicCandidatepublic static native int identityHashCode(Object x);
具体的实现是由HotSpot
虚拟机完成的。
根据:java - How do hashCode() and identityHashCode() work at the back end? - Stack Overflow
一个对象在生存周期内的调用identityHashCode()
的结果是一样的,即使JVM进行了垃圾回收,对象的地址发生了改变。
所以如果一个类实现了equals
方法,但你想判断2个对象是否是内存中的同一个对象,你可以直接用==
判断内存地址是否一样,也可以使用System.identityHashCode()
进行比较。
Java:Object.hashCode()和System.identityHashCode()的区别相关推荐
- Java Object.hashCode()方法
Java Object.hashCode()方法 @(JAVA)[java] 更详细的内容可以参考<effective java>与<think in java> Object ...
- 【Java】hashCode和identityHashCode的区别
1.概述 转载:http://www.javastack.cn/article/2017/hashcode-identityhashcode/ identityHashCode identityHas ...
- hashCode和identityHashCode的区别你知道吗?
转载自 hashCode和identityHashCode的区别你知道吗? hashCode 关于hashCode参考之前的文章,点击参考之前文章. identityHashCode identity ...
- 【Java之多线程(二)】(***重要***)Java多线程中常见方法的区别,如object.wait()和Thread.sleep()的区别等
1.Java中Thread和Runnable的区别??? 区别: 在程序开发中只要是多线程肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下好处: 避免点 ...
- 深入分析Java中打印对象内存地址 System.identityHashCode()方法
文章目录 地址是什么样子的 toString()方法 重写hashCode identityHashCode与真正的内存地址 参考 地址是什么样子的 我们知道system.out.println(ne ...
- java system sleep_详解Java中的sleep()和wait()的区别
详解Java中的sleep()和wait()的区别 对于sleep()方法,我们首先要知道该方法是属于Thread类中的.而wait()方法,则是属于Object类中的. sleep()方法导致了程序 ...
- Java中Object.equals与String.equals的区别
基础知识 Java的存储空间:寄存器.栈.堆.静态存储区.常量存储区(常量池).其他存储位置. 此处重点介绍堆和常量存储区: 堆:存储new的对象; 常量池:用来存储final static.Stri ...
- java Object解析
java Object是所有对象的根父类,所有对象都直接或间接集成自该类. java 的Object类也比较简单,有equals(Object).toString().finalize() java方 ...
- Object.hashCode()与Object.equals()
[README] 本文旨在po出 hashCode , equals的api描述,以加深理解: 本文翻译自 jdk 文档: [1]Object.hashCode() 1)介绍:返回对象的哈希码值.支持 ...
最新文章
- 一个新手对linux的认识
- BZOJ2301:[HAOI2011]Problem b(莫比乌斯反演,容斥)
- python是一种面向对象、直译式的脚本编程语言_什么是python编程语言
- [LeetCode] Search Insert Position 搜索插入位置
- 虚拟化的第一步——VMware基本整合评估服务
- DNS 流程说明以及相关问题的解析
- Java File类void deleteOnExit()方法(带示例)
- 个人Blog小程序开发完毕
- 挑战程序设计竞赛(第2版) 第3章笔记
- 利用pl/sql读文件(简单)
- php 算年龄,php – 根据出生日期计算年龄
- 涨分神器-基于PPYOLOE的切图和拼图解决方案
- jay chou歌词 文本下载数据下载
- XMPP与SIP-IM两大协议的对比
- Linux磁盘分区和逻辑卷
- calcHist的使用
- 【BAT 面试题宝库附详尽答案解析】分布式事务实现原理
- 对朝九晚五的热情到底能持续多久?
- 爱看广场舞的老爷爷的笔记--网络小知识
- CP-ABE,KP-ABE
热门文章
- Science | 智能计算揭示前生命化学网络中合成的连接、出现和自我再生
- OpenCV | OpenCV将图像转换成黑白图像(二进制)
- 北京大学吴华君课题组多组学数据分析方向博士后和技术员招聘启示
- MPB:华大孙海汐等-从细菌基因组中预测活性前噬菌体工具Prophage Hunter的使用流程和常见问题...
- Cell子刊:人体肠道病毒组高度多样、稳定且个体特异
- Cell:大肠癌耐化疗药,细菌是帮凶
- R语言构建xgboost模型:控制训练信息输出级别verbose参数
- R语言使用caretEnsemble包的caretList函数一次性构建多个机器学习模型、使用lattice包的bwplot函数使用箱图对比多个模型在多个指标上的性能差异
- R语言ggplot2可视化:使用dplyr包计算每个分组个数的比例(对计算获得的百分比进行近似,值保留整数部分)、使用ggplot2可视化条形图(bar plot)、并在条形图上添加百分比标签
- R语言使用ggplot2包和ggQC包可视化帕累托图(Pareto chart)