简介:
在java中,有一种key值可以重复的map,就是IdentityHashMap。
在IdentityHashMap中,判断两个键值k1和 k2相等的条件是 k1 == k2 。在正常的Map 实现(如 HashMap)中,当且仅当满足下列条件时才认为两个键 k1 和 k2 相等:(k1==null ? k2==null : e1.equals(e2))。
IdentityHashMap类利用哈希表实现 Map 接口,比较键(和值)时使用引用相等性代替对象相等性。
该类不是 通用 Map 实现,此类实现 Map 接口时,它有意违反 Map 的常规协定,该协定在比较对象时强制使用 equals 方法。
此类设计仅用于其中需要引用相等性语义的罕见情况。
样例:
static void test1() {
IdentityHashMap<String, Object> map = new IdentityHashMap<String, Object>();
map.put(new String("abc"), "first");
map.put(new String("abc"), "second");
for (Map.Entry<String, Object> entry : map.entrySet()) {
System.out.print(entry.getKey() + " ");
System.out.println(entry.getValue());
}
System.out.println("identityHashMap =" + map.containsKey("abc"));
System.out.println("identityHashMap =" + map.get("abc"));
}
static void test2() {
IdentityHashMap<String, Object> map = new IdentityHashMap<String, Object>();
String fsString = new String("abc");
map.put(fsString, "first");
map.put(new String("abc"), "second");
for (Map.Entry<String, Object> entry : map.entrySet()) {
System.out.print(entry.getKey() + " ");
System.out.println(entry.getValue());
}
System.out.println("identityHashMap =" + map.containsKey(fsString));
System.out.println("identityHashMap =" + map.get(fsString));
}
static void test3() {
IdentityHashMap<String, Object> map = new IdentityHashMap<String, Object>();
String fsString = new String("abc");
map.put(fsString, "first");
map.put(fsString, "second");
for (Map.Entry<String, Object> entry : map.entrySet()) {
System.out.print(entry.getKey() + " ");
System.out.println(entry.getValue());
}
System.out.println("identityHashMap =" + map.containsKey(fsString));
System.out.println("identityHashMap =" + map.get(fsString));
}
static void test4() {
IdentityHashMap<String, Object> map = new IdentityHashMap<String, Object>();
String fsString = new String("abc");
String secString = new String("abc");
map.put(fsString, "first");
map.put(secString, "second");
for (Map.Entry<String, Object> entry : map.entrySet()) {
System.out.print(entry.getKey() + " ");
System.out.println(entry.getValue());
}
System.out.println("identityHashMap =" + map.containsKey(fsString));
System.out.println("identityHashMap =" + map.get(fsString));
System.out.println("identityHashMap =" + map.containsKey(secString));
System.out.println("identityHashMap =" + map.get(secString));
}
/**
* IdentityHashMap 与HashMap
*/
static void test5() {
Integer a = new Integer(123456);
Integer b = new Integer(123456);
HashMap hashMap = new HashMap();
hashMap.put(a, 1);
hashMap.put(b, 2);
System.out.println(hashMap);
IdentityHashMap identityHashMap = new IdentityHashMap();
identityHashMap.put(a, 1);
identityHashMap.put(b, 2);
System.out.println(identityHashMap);
}
可以看到,在IdentityHashMap中,是判断key是否为同一个对象,而不是普通HashMap的equals方式判断。
HashMap 同 IdentityHashMap 区别:
HashMap:会使用equals比较key对象IdentityHashMap:使用 == 比较key对象
IdentityHashMap的原理特征:
IdentityHashMap内部使用数组存储数据(伪hash表),key位置会在数组的偶数上,value在key+1的位置上
IdentityHashMap允许key=null,但是会把key=null包装成对象。
IdentityHashMap判断key是否相等使用的是“对象相等”,即key1==key2。
IdentityHashMap内部无序。