8.6.7 IdentityMap实现类

8.6.7 IdentityMap实现类

两个key是同一个对象的引用时IdentityMap才认为这两个key相等

IdentityMap这个Map实现类的实现机制与HashMap基本相似,不过,IdentityMap在处理两个key相等时比较独特:

  • IdentityHashMap中,当且仅当两个key严格相等时, IdentityHashMap才认为两个key相等;
    • 所谓严格相等即:key1==key2。也就是说,只有key1key2是同一个对象的引用,IdentityHashMap才认为两个key相等.

普通的HashMap通过equals和hashCode来判断相等

对于普通的HashMap而言,只要key1key2通过equals()方法比较返回true,且它们的hashCode值相等即可。

IdentityHashMap违反了Map的通常规范

IdentityHashMap是一个特殊的Map实现!此类实现Map接口时,它有意违反了Map的通常规范: IdentityHashMap要求两个key严格相等时才认为两个key相等。

IdentityHashMap的key和value可以为null

IdentityHashMap提供了与HashMap基本相似的方法,也允许使用null作为keyvalue

IdentityHashMap无序

HashMap相似: IdentityHashMap也不保证key-value对之间的顺序,更不能保证它们的顺序随时间的推移保持不变。

程序 IdentityHashMap示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.util.*;

public class IdentityHashMapTest
{
public static void main(String[] args)
{
IdentityHashMap ihm = new IdentityHashMap();
// 下面两行代码将会向IdentityHashMap对象中添加两个key-value对
// 虽然作为key的这两个字符串通过equals()方法比较相等
// 但不是同一个对象,所以IdentityHashMap认为这两个key不相等,可以添加
ihm.put(new String("语文") , 89);
ihm.put(new String("语文") , 78);
// 下面两行代码只会向IdentityHashMap对象中添加一个key-value对
// 字符串直接量只会创建一次,所以这两个对象是同一个对象.
// IdentityHashMap认为这两个key相等,所以只会添加一次.
ihm.put("java" , 93);
ihm.put("java" , 98);
System.out.println(ihm);
}
}

编译、运行上面程序,看到如下运行结果:

1
{语文=89, java=98, 语文=78}

上面程序试图向IdentityHashMap对象中添加4个key-value对,

  • 前2个key-value对中的key是新创建的字符串对象,它们通过==运算符比较不相等,所以IdentityHashMap会把它们当成2个key来处理;
  • 后2个key-value对中的key都是字符串直接量,而且它们的字符序列完全相同,Java使用常量池来管理字符串直接量,所以它们通过一比较返回true, IdentityHashMap会认为它们是同一个key,因此只有第一次可以添加成功