8.6.7 IdentityMap实现类
8.6.7 IdentityMap实现类
两个key是同一个对象的引用时IdentityMap才认为这两个key相等
IdentityMap
这个Map
实现类的实现机制与HashMap
基本相似,不过,IdentityMap
在处理两个key
相等时比较独特:
- 在
IdentityHashMap
中,当且仅当两个key
严格相等时,IdentityHashMap
才认为两个key
相等;- 所谓严格相等即:
key1==key2
。也就是说,只有key1
和key2
是同一个对象的引用,IdentityHashMap
才认为两个key
相等.
- 所谓严格相等即:
普通的HashMap通过equals和hashCode来判断相等
对于普通的HashMap
而言,只要key1
和key2
通过equals()
方法比较返回true
,且它们的hashCode
值相等即可。
IdentityHashMap违反了Map的通常规范
IdentityHashMap
是一个特殊的Map
实现!此类实现Map
接口时,它有意违反了Map
的通常规范: IdentityHashMap
要求两个key
严格相等时才认为两个key
相等。
IdentityHashMap的key和value可以为null
IdentityHashMap
提供了与HashMap
基本相似的方法,也允许使用null
作为key
和value
。
IdentityHashMap无序
与HashMap
相似: IdentityHashMap
也不保证key-value
对之间的顺序,更不能保证它们的顺序随时间的推移保持不变。
程序 IdentityHashMap示例
1 | import java.util.*; |
编译、运行上面程序,看到如下运行结果:
1 | {语文=89, java=98, 语文=78} |
上面程序试图向IdentityHashMap
对象中添加4个key-value
对,
- 前2个
key-value
对中的key
是新创建的字符串对象,它们通过==
运算符比较不相等,所以IdentityHashMap
会把它们当成2个key
来处理; - 后2个
key-value
对中的key
都是字符串直接量,而且它们的字符序列完全相同,Java
使用常量池来管理字符串直接量,所以它们通过一比较返回true
,IdentityHashMap
会认为它们是同一个key
,因此只有第一次可以添加成功。