Java中multiMap 与 ListMultiMap理解

一、问题与现象

对于map中的每个key,其value为一个列表。

传统的实现方式:

    @Test
    public void testTraditionMap() {
        Map<String,List> map = new HashMap<String,List>();
        putMyObject(map, "key1", "value1");
        System.out.println(map);
    }

    void putMyObject(Map<String,List> map, String key, String value) {
        List<String> myClassList = map.get(key);
        if(myClassList == null) {
            myClassList = new ArrayList<String>();
            map.put(key,myClassList);
        }
        myClassList.add(value);
    }

这种方式的缺点:

向map里面添加元素不方便,每次都需要检查key对应的value是否已存在,如果不存在,就创建列表。

注意:HashMap的key和value皆可为null,HashTable的key和value皆不可为null。二者的key皆不可重复,若重复,后添加的会覆盖之前的。

二、使用ArrayListMultimap

对于上面传统的场景,可以使用ArrayListMultimap来进行优化。

 @Test
    public void testArrayListMultiMap() {
        Multimap<String, String> multimap = ArrayListMultimap.create();
        multimap.put("fruit", "banana");
        multimap.put("fruit", "apple"); // key可以重复
        multimap.put("fruit", "apple"); // value可以重复,不会覆盖之前的
        multimap.put("fruit", "peach");
        multimap.put("fish", "crucian"); // 欧洲鲫鱼
        multimap.put("fish", "carp"); // 鲤鱼

        System.out.println(multimap.size());//6

        Collection<String> fruits = multimap.get("fruit");
        System.out.println(fruits); // [banana, apple, apple, peach]
        List<String> list = Lists.newArrayList();
        list.addAll(fruits);
        System.out.println(list);

        for (String s : multimap.values()) {
            System.out.print(s + " , "); // banana , apple , apple , peach , crucian , carp ,
        }
        System.out.println();

        multimap.remove("fruit", "apple"); // 删除指定key和value
        System.out.println(fruits); // [banana, apple, peach]   注意:这里只remove了一个apple, 因此还有一个apple

        multimap.removeAll("fruit");
        System.out.println(fruits); // []
    }
对于ArrayListMultimap,其get(key)方法的返回值是collection,如果希望返回值是list,那么可以选择 ListMultimap 来接收 create()的返回值。
    @Test
    public void testListMultimap() {
        ListMultimap<String, String> listMultimap = ArrayListMultimap.create();
        listMultimap.put("fruit", "banana");
        listMultimap.put("fruit", "apple");
        listMultimap.put("fruit", "apple");
        listMultimap.put("fruit", "peach");
        listMultimap.put("fish", "crucian"); // 欧洲鲫鱼
        listMultimap.put("fish", "carp"); // 鲤鱼

        List<String> fruits = listMultimap.get("fruit");
        System.err.println(fruits); // [banana, apple, apple, peach]
    }

三、对比HashMultimap

对于HashMultimap而言,在添加元素的时候,会计算元素的hash值,同等hash值的元素会被忽略。

@Test
    public void testHashMultiMap() {
        Multimap<String, String> multimap = HashMultimap.create();
        multimap.put("fruit", "banana");
        multimap.put("fruit", "apple");
        multimap.put("fruit", "apple");
        multimap.put("fruit", "apple");
        multimap.put("fish", "crucian"); // 欧洲鲫鱼
        multimap.put("fish", "carp"); // 鲤鱼

        System.err.println(multimap.size()); // 4
        System.err.println(multimap.get("fruit")); // [apple, banana] 注意: 这里只有一个apple

    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值