Guava类库——BiMap和Multimap详解

导读:本篇文章讲解 Guava类库——BiMap和Multimap详解,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

前言

Guava 是一套来自 Google 的核心 Java 库,其中包括新的集合类型、不可变的集合、图库,以及并发、I/O、散列、缓存、基元、字符串等实用工具!

它更细粒度的提供了一些jdk没有的api和优化了一些操作,可以让你的代码更加优雅简洁高效。

它被广泛用于 Google 内部的大多数 Java 项目,也被许多其他公司广泛使用。它被广泛用于 Google 内部的大多数 Java 项目,也被许多其他公司广泛使用。

一、引入Guava

maven如下:

		<dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>31.1-jre</version>
        </dependency>

二、BiMap

jdk自带的Map是key是唯一的,value可以是重复的。

那能不能key和value都是唯一的呢,通过key可以找到value,通过value也可以找到key。

BiMap就是这样的双向map,且key和value都是唯一的。

注意:是在使用BiMap进行put时value不能重复,否则会抛出异常。

1.BiMap的创建和使用

		//创建一个BiMap
        BiMap<String,String> bigMap = HashBiMap.create();
        bigMap.put("a","1");
        bigMap.put("b","2");
		
        //通过key查找value
        System.out.println(bigMap.get("a"));//1
        //通过value查找key
        System.out.println(bigMap.inverse().get("2"));//b

2.HashMap转为BiMap

        Map<String, String> map = new HashMap<>();
        map.put("a","1");
        map.put("b","2");

        BiMap<String,String> bigMap = HashBiMap.create(map);
        System.out.println(bigMap);//{a=1, b=2}

3.使用forcePut覆盖value的值

        BiMap<String,String> bigMap = HashBiMap.create();
        bigMap.put("a","1");
        bigMap.put("b","2");
        System.out.println(bigMap);//{a=1, b=2}
        bigMap.forcePut("c","2");
        System.out.println(bigMap);//{a=1, c=2}

三、Multimap

代码里我们经常这样写 Map<k,List>,好像有点臃肿!另外我们还得判断key是否存在来决定是否 new 一个 List 出来,有点麻烦!更加麻烦的事情还在后头,比如遍历,比如删除。

所以Guava产生了Multimap来代替 Map<k,List> ,Multimap有点类似Map,但是Multimap中每个键可能与多个值相关联(即重复put相同的key时不会覆盖原来的)

1.Multimap的创建和使用

		Multimap<String,Integer> map = ArrayListMultimap.create();
        map.put("a",1);
        map.put("a",2);
        map.put("a",2);
        map.put("b",3);
        map.put("b",4);
		//{a=[1, 2, 2], b=[3, 4]}
        System.out.println(map);

2.获取值

(1) 根据key获取值

        Multimap<String,Integer> map = ArrayListMultimap.create();
        map.put("a",1);
        map.put("a",2);
        map.put("a",2);
        map.put("b",3);
        map.put("b",4);
        System.out.println(map);

        Collection<Integer> values = map.get("a");
        //[1, 2, 2]
        System.out.println(values);

(2) 获取所有的key和value

        Multimap<String,Integer> map = ArrayListMultimap.create();
        map.put("a",1);
        map.put("a",2);
        map.put("a",2);
        map.put("b",3);
        map.put("b",4);
        System.out.println(map);

        Set<String> keys = map.keySet();
        //[a, b]
        System.out.println(keys);
        Collection<Integer> values = map.values();
        //[1, 2, 2, 3, 4]
        System.out.println(values);

3. 获取所有的key的大小和value的大小
size()返回存储 Map 中实际值的数量,但keySet().size()返回不同键的数量。

        Multimap<String,Integer> map = ArrayListMultimap.create();
        map.put("a",1);
        map.put("a",2);
        map.put("a",2);
        map.put("b",3);
        map.put("b",4);
        System.out.println(map);

        int keysSize = map.keySet().size();
        //2
        System.out.println(keysSize);
        int valuesSize = map.size();
        //5
        System.out.println(valuesSize);

4. Multimap转Map

Multimap转Map后,这个Map支持remove和修改操作,但是不支持put和putAll操作

        Multimap<String,Integer> map = ArrayListMultimap.create();
        map.put("a",1);
        map.put("a",2);
        map.put("a",2);
        map.put("b",3);
        map.put("b",4);
        //{a=[1, 2, 2], b=[3, 4]}
        System.out.println(map);
        
        Map<String, Collection<Integer>> map1 = map.asMap();
        Collection<Integer> aValue = map1.get("a");
        aValue.add(999);
        //{a=[1, 2, 2, 999], b=[3, 4]}
        System.out.println(map1);

//       不能put会抛出异常        
//        Collection<Integer> collection=new ArrayList<>();
//        collection.add(88);
//        collection.add(88);
//        map1.put("c",collection);

5.遍历

        Multimap<String,Integer> map = ArrayListMultimap.create();
        map.put("a",1);
        map.put("a",2);
        map.put("a",2);
        map.put("b",3);
        map.put("b",4);
        //{a=[1, 2, 2], b=[3, 4]}
        System.out.println(map);

        for (Map.Entry<String,Integer> m: map.entries()) {
            System.out.println("key是:"+m.getKey()+" value是:"+m.getValue());
        }

输出:

{a=[1, 2, 2], b=[3, 4]}
key是:a value是:1
key是:a value是:2
key是:a value是:2
key是:b value是:3
key是:b value是:4

转换为Map后遍历:

        Multimap<String,Integer> map = ArrayListMultimap.create();
        map.put("a",1);
        map.put("a",2);
        map.put("a",2);
        map.put("b",3);
        map.put("b",4);
        //{a=[1, 2, 2], b=[3, 4]}
        System.out.println(map);

		Map<String, Collection<Integer>> map1 = map.asMap();
        for (Map.Entry<String,Collection<Integer>> m:map1.entrySet()) {
            System.out.println("key是:"+m.getKey()+" value是:"+m.getValue());
        }

输出:

{a=[1, 2, 2], b=[3, 4]}
key是:a value是:[1, 2, 2]
key是:b value是:[3, 4]

6.使用Multimap的优点

  • 在使用put()添加数据之前无需创建新的空集合
  • get() 方法不返回null,只返回一个空集合(可以不用像Map<k,List>获取值时去判空检查)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/80224.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!