identityhashmap使用==比较键的内存地址而非equals(),基于system.identityhashcode()计算哈希,适用于对象身份映射等需引用相等的场景。

IdentityHashMap 不是通过 equals() 方法,而是直接用 == 运算符比较两个键对象的内存地址来判断是否相等。
底层用 == 而非 equals()
普通 HashMap 使用 key.equals(otherKey) 判断键是否重复,而 IdentityHashMap 绕过重写的 equals() 方法,只看两个引用是否指向堆中同一块内存。即使两个对象内容完全相同、equals() 返回 true,只要不是同一个对象实例,就被视为不同键。
哈希值也基于 System.identityHashCode()
它的 hash 计算不调用 key.hashCode(),而是使用 JVM 提供的 System.identityHashCode(key) —— 这个值在对象生命周期内固定,且与对象内存地址强相关(尽管不一定是真实地址,但能保证同一对象多次调用返回相同值,不同对象大概率不同)。这样确保 hash 值和地址判断逻辑一致。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
数组索引计算与线性探测
内部用一个 Object 数组存储键值对(键值交替存放),索引由 hash & (table.length - 1) 得到。发生冲突时,它不拉链,而是向后线性查找下一个空位或遇到第一个 null 结束;查找时,对每个候选位置先检查键是否为 null,再用 == 比较目标键与当前槽位的键。
典型适用场景
这种设计适合需要“引用语义”的场景,比如:
- 缓存对象自身的元数据(如序列化句柄、代理包装器)
- 图遍历中记录已访问节点(避免因 equals 重写导致误判)
- 实现弱/软引用无关的严格身份映射(注意:它本身不带引用队列,和 WeakHashMap 不同)
它不支持 null 作为键(会抛 NullPointerException),但允许 null 值。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










