system.identityhashcode()直接返回jvm分配的对象身份哈希码,天然独立于hashcode()重写,基于对象创建时确定的内存地址或内部id,适用于调试、identityhashmap及区分同内容不同实例等场景。

System.identityHashCode 本身就是用来获取对象“原始哈希码”的——它不依赖 hashCode() 方法的重写,而是基于对象在 JVM 中的内存地址(或其稳定衍生物)生成唯一标识。所以它不是“绕过”,而是**天然独立于重写的 hashCode**。
identityHashCode 的本质
它返回的是对象的“身份哈希码”(identity hash code),由 JVM 在对象创建时分配,与 Object.hashCode() 的默认实现行为一致。即使你重写了 hashCode(),System.identityHashCode(obj) 的结果仍保持不变。
例如:
public class Person {
private String name;
public Person(String name) { this.name = name; }
@Override
public int hashCode() { return name != null ? name.hashCode() : 0; }
}
Person p = new Person("Alice");
System.out.println(p.hashCode()); // 输出 "Alice".hashCode()
System.out.println(System.identityHashCode(p)); // 输出一个固定整数,与 name 无关,每次运行可能不同但对象生命周期内稳定
什么时候该用 identityHashCode
当你需要区分“逻辑相等”和“物理同一”时:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 实现自定义引用相等性判断(比如避免因重写
hashCode()导致的哈希表误判) - 调试时追踪对象是否为同一个实例(尤其在集合操作、缓存穿透排查中)
- 在弱引用/软引用容器中做快速去重(不依赖业务逻辑的 hashCode)
- 实现对象图序列化或深克隆时识别循环引用
注意事项
它不是绝对唯一的:虽然极大概率唯一,但在某些 JVM 实现或长时间运行后可能发生哈希碰撞(概率极低,不影响常规使用)。
它不能用于跨 JVM 或持久化场景:值仅在当前 JVM 实例中有效,重启后变化,也不具备可序列化语义。
对 null 安全:传入 null 会返回 0,不会抛异常。
替代方案对比
如果只是想临时跳过重写逻辑,不要试图“恢复”或“反编译”默认 hashCode —— 直接用 System.identityHashCode 就是标准做法。没有更底层或更“原始”的公开 API 可用;JVM 不暴露内存地址,identityHashCode 是设计好的安全抽象。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










