0%

8.6.7 IdentityMap实现类

8.6.7 IdentityMap实现类

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

  • IdentityHashMap中,当且仅当两个key严格相等时, IdentityHashMap才认为两个key相等;
    • 所谓严格相等即:key1==key2,这就是key1key2是同一个对象的引用.
  • 对于普通的HashMap而言,只要key1key2通过equals()方法比较返回true,且它们的hashCode值相等即可。

IdentityHashMap是一个特殊的Map实现!此类实现Map接口时,它有意违反了Map的通常规范: IdentityHashMap要求两个key严格相等时才认为两个key相等。
IdentityHashMap提供了与HashMap基本相似的方法,也允许使用null作为keyvalue。与HashMap相似: IdentityHashMap也不保证key-value对之间的顺序,更不能保证它们的顺序随时间的推移保持不变。

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,因此只有第一次可以添加成功。

原文链接: 8.6.7 IdentityMap实现类