identityhashmap 用 == 判断 key 是否相等且基于 system.identityhashcode() 计算哈希,不调用 equals() 和 hashcode();而 hashmap 要求 hashcode 相等且 equals 为 true。

IdentityHashMap 判断 key 是否相等,只看两个引用是不是指向同一个对象实例,也就是用 == 运算符,完全不调用 equals() 方法。这和 HashMap 等常规 Map 实现有本质区别。
key 相等性判断方式完全不同
普通 HashMap 要求两个 key 同时满足:
key1.hashCode() == key2.hashCode()key1.equals(key2) == true
缺一不可,体现的是“逻辑相等”。而 IdentityHashMap 只需要:
-
key1 == key2成立 —— 即内存地址相同
哪怕两个对象字段一模一样、equals() 返回 true,只要不是同一个实例,就被当成不同 key。
哈希值来源彻底隔离
HashMap 的哈希值来自 key.hashCode(),受类中重写逻辑影响;IdentityHashMap 则固定使用:
System.identityHashCode(key)
这个值由 JVM 在对象创建时基于初始内存地址生成,不可被重写,生命周期内稳定,且与 == 判断逻辑一致 —— 不同对象大概率哈希不同,相同对象一定哈希相同。
null key 的处理也更“严格”
HashMap 把所有 null 当作同一个 key,多次 put(null, v) 会覆盖;IdentityHashMap 允许多个 null 值,只要它们是不同引用(比如 new Object[]{null}[0] 和字面量 null 在某些上下文中可能被视为不同引用,但实践中通常仍按单个 null 处理;真正差异体现在非 null 对象上)。
value 的比较没变,仍是常规逻辑
IdentityHashMap 只改了 key 的相等判断和哈希计算方式,value 的存储、查找、equals() 和 hashCode() 行为与 HashMap 完全一致 —— 它不干涉 value 的语义。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











