System.identityHashCode 返回对象在JVM中的身份哈希码,基于首次分配内存位置生成且不可被重写,null时返回0;用于区分同一性而非相等性,适用于调试、自定义哈希容器及缓存唯一性标记。

System.identityHashCode 获取的是对象在 JVM 中的“身份哈希码”,它与对象内存地址相关,但不是直接的地址值,而是基于对象首次分配时的内存位置生成的一个固定整数。
它和普通 hashCode 的区别
普通 hashCode() 是可被重写的(比如 String、Integer 都重写了),返回的是逻辑意义上的哈希值;而 identityHashCode 不受重写影响,始终反映对象的“身份”——即使两个对象内容完全相同、hashCode() 返回一样,只要不是同一个实例,它们的 identityHashCode 也不同(极小概率冲突除外)。
怎么用:直接调用即可
语法很简单:
- System.identityHashCode(obj) —— 参数为任意非 null 对象引用
- 如果传入 null,返回 0(注意不是抛异常)
- 返回值是 int 类型,和普通 hashCode 一样,可用于哈希表、比较判等场景
典型使用场景
当你需要区分“是不是同一个对象”而不是“内容是否相等”时:
立即学习“Java免费学习笔记(深入)”;
- 调试中判断两个引用是否指向同一块堆内存(尤其在重写了 hashCode 的类里)
- 实现自定义哈希容器时,想绕过对象自身的 hashCode 实现
- 在弱引用/软引用或缓存系统中做对象唯一性标记
- 避免因 equals/hashCode 不一致导致的 Map 键冲突问题
注意事项
虽然 identityHashCode 通常稳定,但要注意:
- 它不保证跨 JVM 进程、跨次运行一致
- 对象被 GC 后,其 identityHashCode 可能被复用于新对象(但实践中极少影响使用)
- 不要把它当成内存地址用(JVM 可能启用压缩指针、GC 移动对象等,底层做了抽象)


















