首先感谢大家的阅读,如果感兴趣,欢迎关注+点赞+留言讨论。
说起Guava,Java界应该是无人不知无人不晓,毕竟是Google内部使用并开源出来的Java工具类库,Google的很多项目都在使用Guava,相信经过Google线上这么多年的使用优化和打磨,Guava的类库的性能得到了非常好的验证,大家大可放心使用。
![67b075e3e86545e26c39cd78f40dbfd9.png](https://i-blog.csdnimg.cn/blog_migrate/fc34844ec4d851ccdec34314aaa76254.jpeg)
下面就开始介绍今天写这篇文章的目的,那就是:为了一个迟到的承诺。
今年7月底我曾经写过一篇介绍Guava的文章,链接如下:Java界的开源利器Guava,这么牛的干货用起来。
当时只是简单介绍了下Guava的功能和入门配置,但因为Guava的核心工具类库很多,一篇文章无法详细讲解每个核心类库,所以我在文章末尾发起了一个投票,想看看大家对这些核心类库有什么想法,最想学习哪个类库的使用方法。想着等待时间长点,这样用户的投票结果相对来说有意义,于是今天看了一些投票结果,发现大家对Guava的集合类库-collections投票人数较多,占比79%,所以今天就专门说一下Guava的集合类库。
话说这么少的人数投票,好可怜啊,好惨一男的,还请大家多多关注。
![bc449d4f5bf5092ac84f9ec975c4fcce.png](https://i-blog.csdnimg.cn/blog_migrate/d4c18073949d4c4ce2b02e457d7448ca.jpeg)
Guava的所有集合类库都在com/google/common/collect包里,大家如果想查看源代码的话,直接GitHub下载最新的mater分支,进入到该package里就可以学习了。
![f6fdf8c6214766d507e15c17f182773e.png](https://i-blog.csdnimg.cn/blog_migrate/6e1084e0eb5f433c523d05276646e102.jpeg)
Guava 的集合类是对 JDK 集合类的扩展,Guava沿着JDK中原生集合的路线提供了更多的工具方法:适用于所有集合的静态方法,那么Guava的集合类增加了哪些具体类型呢?下面咱就来一一细说:
一、不可修改的集合-Immutable Collections
在写代码的时候,我们经常需要用到不可变对象,尤其是不可变集合,这在一些特定业务场景非常有用,比如:
1. 线程安全场景下,不可变对象是非常好的选择;
2. 可以当做常量使用;
3. 不受信任的库可以直接使用;
有些人或许会说,JDK本身的Collection也有不可变的版本,可以通过使用Collections.unmodifiableXXX 方法来实现。是的,没错,JDK也可以实现,但是他的实现是有缺陷的,下面咱就一个List为例说一下这个问题。
JDK版本的不可变List代码如下:
List list = new ArrayList<>(Arrays.asList(1,2,3,4,5)); List umList = Collections.unmodifiableList(list);
上面代码中umList经过一层转换后是不可变对象,但是他的原值list对象确是可变的,umList只是持有了一个list的引用,可以通过修改list的值来达到修改umList的目的,这也就说明了JDK版本的不可变集合不是真正的不可变,是有很大缺陷的。
那么我们再来看一下Guava如何实现不可变集合:
ImmutableCollection icList = ImmutableList.of(1, 2, 3, 4, 5);
就这么简单一句代码,就声明了一个真正不可变的list集合icList,是不是很简洁方便?
上面的代码以ImmutableList举例,但是Guava还提供了ImmutableSet,ImmutableMap,ImmutableCollection等类,可以根据需要的数据结构分别调用。
二、Set的计数器-Multiset
JDK中Set集合是不可以添加重复元素,而且元素是无顺序的,但Multiset是可以放入重复元素,并对这些元素进行计数。
那么关于Multiset我们可以这么理解,它耦合了2种数据结构:ArrayList和Map,当添加元素,获取集合大小和循环时可以当做普通的ArrayList来使用,但当调用查询接口时,当做Map使用,比如count(Object obj)这个方法就是查询obj在Multiset中的个数,就直接把obj当做Map的key,查询结果value当做obj出现的个数。
这样解释一番,是不是很容易理解了?
三、value也是集合的Map-Multimap
简单点说,Multimap就是Map> or Map> 类似的数据结构,Guava只是把这种复杂点的结构重新包装成一个新的类型,方便大家使用,简洁代码,方便阅读,据说代码简洁可以加快人们的思考速度,提升工作效率,哈哈。
通常来说不会直接使用 Multimap 接口,而是使用 ListMultimap 或者 SetMultimap ,对应将 key 映射到 List 或者 Set 。
最直接构建 Multimap 的方式是使用 MultimapBuilder,这种方式允许用户自定义 key 和 value 应该有的样式,当然也可以用create()方法,这也是我最常用的方式:
ArrayListMultimap userSign = ArrayListMultimap.create(); userSign.put("zhangsan