Java IdentityHashMap与HashMap的区别

IdentityHashMap与HashMap的区别
除了 IdentityHashMap中key可以重合,还有别的区别吗

阅读 19.5k
3 个回答
  1. 简单说IdentityHashMap与常用的HashMap的区别是:前者比较key时是“引用相等”而后者是“对象相等”,即对于k1和k2,当k1==k2时,IdentityHashMap认为两个key相等,而HashMap只有在k1.equals(k2) == true 时才会认为两个key相等。IdentityHashMap 允许使用null作为key和value. 不保证任何Key-value对的之间的顺序, 更不能保证他们的顺序随时间的推移不会发生变化.

  2. IdentityHashMap有其特殊用途,比如序列化或者深度复制。或者记录对象代理。

  3. 举个例子,jvm中的所有对象都是独一无二的,哪怕两个对象是同一个class的对象,而且两个对象的数据完全相同,对于jvm来说,他们也是完全不同的,如果要用一个map来记录这样jvm中的对象,你就需要用IdentityHashMap,而不能使用其他Map实现。

  • 两者最主要的区别是IdentityHashMap使用的是==比较key的值,而HashMap使用的是equals()
  • HashMap使用的是hashCode()查找位置,IdentityHashMap使用的是System.identityHashCode(object)
  • IdentityHashMap理论上来说速度要比HashMap快一点
  • 另外一点呢就是IdentityHashMap中key能重复,但需要注意一点的是key比较的方法是==,所以若要存放两个相同的key,就需要存放不同的地址,下面用代码来说明:

    import java.util.HashMap;
    import java.util.IdentityHashMap;
    import java.util.Map;
    
    public class IdentityMapDemo {
    
        public static void main(String[] args) {
             Map identityMap = new IdentityHashMap();
             identityMap.put("a", 1);
             identityMap.put(new String("a"), 2);
             identityMap.put("a", 3);
             System.out.println("Identity Map KeySet Size :: " +  identityMap.keySet().size());
     //输出结果为Identity Map KeySet Size :: 2
         }
    
     }
    

Jdk Api
IdentityHashMap:此类利用哈希表实现 Map 接口,比较键(和值)时使用引用相等性代替对象相等性。
换句话说,在 IdentityHashMap 中,当且仅当 (k1==k2)
才认为两个键 k1 和 k2 相等、在正常 Map 实现(如 HashMap)中
当且仅当满足下列条件时才认为两个键 k1 和 k2 相等:(k1==null ? k2==null : e1.equals(e2))

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏