HashMap,LinkedHashMap,IdentityHashMap,HashSet之间的区别

1.HashMap键值不允许重复,重复会覆盖之前的键值对,显示的是最后的键值对
2.HashSet存放的是某种类型的数据,如果数据重复,就不会往集合里添加数据,显示的是之前的数据
3.map,set都是无序的,LinkedHashMap跟LinkedHashSet是有序的(相对有序),LinkedHashMap键值也是不允许重复,如果最后一个数据跟之前重复,那LinkedHashMap最后一个数据是排在后面且跟之前无重复键值的数据

public class  ExampleUnitTest {

    private boolean playflag=false;
    String key="status";
    private Set<String> hashset=new HashSet();
    private LinkedHashMap<String, Integer> map = new LinkedHashMap<>();
    private String letters[] = { "a", "b", "c", "d", "e","b" };

    @Before
    public void init() {
        System.out.println(letters.length);
        for (int i = 0; i < letters.length; i++) {
            map.put(letters[i], i + 1);
            if(!hashset.add(letters[i]))
                System.out.println("repeat"+i);
        }
        for (String s : map.keySet()) {
            System.out.println("key= " + s + "  and  value= " + map.get(s));
        }
       for(Integer string :map.values()){
            System.out.println("value is "+string);
        }
        System.out.println("---unsortmap-----");
        Map<String, Integer> m = new HashMap<>();
        for (int i = 0; i < 10; i++) {
            m.put("key" + i, i);
        }
        System.out.println(m);//{key=value}的形式 map是无序!
    }

    @Test
    public void testGetHead() {
        assertEquals(getHead(map).getKey(), "a");
        assertEquals(getHead(map).getValue(), Integer.valueOf(1));
    }

    @Test
    public void testGetTail() {
        System.out.println(map.size());
        System.out.println(hashset.size());
        assertEquals(getTail(map).getKey(), "e");
        assertEquals(getTail(map).getValue(), Integer.valueOf(5));
    }

    @Test
    public void testGetTailByReflection() throws NoSuchFieldException, IllegalAccessException {
        assertEquals(getTailByReflection(map).getKey(), "e");
        assertEquals(getTailByReflection(map).getValue(), Integer.valueOf(5));
    }

    public <K, V> Map.Entry<K, V> getHead(LinkedHashMap<K, V> map) {
        return map.entrySet().iterator().next();
    }

    public <K, V> Map.Entry<K, V> getTail(LinkedHashMap<K, V> map) {
        Iterator<Map.Entry<K, V>> iterator = map.entrySet().iterator();
        Map.Entry<K, V> tail = null;
        while (iterator.hasNext()) {
            tail = iterator.next();
        }
        return tail;
    }

    @SuppressWarnings("unchecked")
    public <K, V> Map.Entry<K, V> getTailByReflection(LinkedHashMap<K, V> map)
            throws NoSuchFieldException, IllegalAccessException {
        Field tail = map.getClass().getDeclaredField("tail");
        tail.setAccessible(true);
        return (Map.Entry<K, V>) tail.get(map);
    }
 }

4.HashMap操作时key是不能重复的,如果重复则肯定会覆盖之前的内容

使用IdentityHashMap,key允许重复,只要两个对象的地址不相等即可

HashMap比较的是equals,IdentitiHashMap比较的是对象地址(是引用而不是值)

map = new HashMap(); // 实例化Map对象

map.put(new Person(“张三”, 30), “zhangsan_1”); // 增加内容

map.put(new Person(“张三”, 30), “zhangsan_2”); // 增加内容,key重复

map.put(new Person(“李四”, 31), “lisi”);

Output:

姓名:李四;年龄:31 –> lisi

姓名:张三;年龄:30 –> zhangsan_2

map = new IdentityHashMap(); // 实例化Map对象

map.put(new Person(“张三”, 30), “zhangsan_1”); // 增加内容

map.put(new Person(“张三”, 30), “zhangsan_2”); // 增加内容,key重复

map.put(new Person(“李四”, 31), “lisi”); // 增加内容

Output:

姓名:张三;年龄:30 –> zhangsan_2

姓名:张三;年龄:30 –> zhangsan_1

姓名:李四;年龄:31 –> lisi

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值