IdentityHashMap实现了Map接口,用法与HashMap差不多,都是用Hash表实现数据的存储,比较key的值是否相等,如果相等就替换原有的值。
但是和hashmap最大的区别就是IdentityHash在比较key的时候使用的是”==“,也就是比较的是地址,而普通的hashmap在比较key的时候使用的是equals,如下方法:k1==null ? k2==null : k1.equals(k2)
也正是由于IdentityHashmap的这个特点,那么在使用时需要小心。看一个例子:
IdentityHashMap<String, String> identityHashMap = new IdentityHashMap();
String s1 = new String("test");
String s2 = new String("test");
identityHashMap.put(s1,"value");
identityHashMap.put(s2,"value1");
System.out.println(identityHashMap.get("test"));
System.out.println(identityHashMap);
输出:
null
{test=value1,test=value}
为什么会是这样?这就需要了解String的常量池。
s1、s2 都是new出来的,所以他们的地址肯定不同,在使用get方法传递参数时”test“是直接放到了常量池中,所以地址和s1、s2也不同,所以get的结果是null。