collection集合 最新_开源利器Guava之好用到哭的核心类库集合 「collections」

首先感谢大家的阅读,如果感兴趣,欢迎关注+点赞+留言讨论。

说起Guava,Java界应该是无人不知无人不晓,毕竟是Google内部使用并开源出来的Java工具类库,Google的很多项目都在使用Guava,相信经过Google线上这么多年的使用优化和打磨,Guava的类库的性能得到了非常好的验证,大家大可放心使用。

67b075e3e86545e26c39cd78f40dbfd9.png

下面就开始介绍今天写这篇文章的目的,那就是:为了一个迟到的承诺。

今年7月底我曾经写过一篇介绍Guava的文章,链接如下:Java界的开源利器Guava,这么牛的干货用起来。

当时只是简单介绍了下Guava的功能和入门配置,但因为Guava的核心工具类库很多,一篇文章无法详细讲解每个核心类库,所以我在文章末尾发起了一个投票,想看看大家对这些核心类库有什么想法,最想学习哪个类库的使用方法。想着等待时间长点,这样用户的投票结果相对来说有意义,于是今天看了一些投票结果,发现大家对Guava的集合类库-collections投票人数较多,占比79%,所以今天就专门说一下Guava的集合类库。

话说这么少的人数投票,好可怜啊,好惨一男的,还请大家多多关注。

bc449d4f5bf5092ac84f9ec975c4fcce.png

Guava的所有集合类库都在com/google/common/collect包里,大家如果想查看源代码的话,直接GitHub下载最新的mater分支,进入到该package里就可以学习了。

f6fdf8c6214766d507e15c17f182773e.png

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值