IdentityHashMap—允许键重复

简介:

在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内部无序。
      

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值