百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

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

toyiye 2024-05-25 20:11 20 浏览 0 评论

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

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

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

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

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

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

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

Guava 的集合类是对 JDK 集合类的扩展,Guava沿着JDK中原生集合的路线提供了更多的工具方法:适用于所有集合的静态方法,那么Guava的集合类增加了哪些具体类型呢?下面咱就来一一细说:

一、不可修改的集合-Immutable Collections

在写代码的时候,我们经常需要用到不可变对象,尤其是不可变集合,这在一些特定业务场景非常有用,比如:

1. 线程安全场景下,不可变对象是非常好的选择;

2. 可以当做常量使用;

3. 不受信任的库可以直接使用;

有些人或许会说,JDK本身的Collection也有不可变的版本,可以通过使用Collections.unmodifiableXXX 方法来实现。是的,没错,JDK也可以实现,但是他的实现是有缺陷的,下面咱就一个List为例说一下这个问题。

JDK版本的不可变List代码如下:

 List<Integer> list = new ArrayList<>(Arrays.asList(1,2,3,4,5));
 List<Integer> 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<E, Integer>,当添加元素,获取集合大小和循环时可以当做普通的ArrayList来使用,但当调用查询接口时,当做Map使用,比如count(Object obj)这个方法就是查询obj在Multiset中的个数,就直接把obj当做Map的key,查询结果value当做obj出现的个数。

这样解释一番,是不是很容易理解了?

三、value也是集合的Map-Multimap

简单点说,Multimap就是Map<K, List<V>> or Map<K, Set<V>> 类似的数据结构,Guava只是把这种复杂点的结构重新包装成一个新的类型,方便大家使用,简洁代码,方便阅读,据说代码简洁可以加快人们的思考速度,提升工作效率,哈哈。

通常来说不会直接使用 Multimap 接口,而是使用 ListMultimap 或者 SetMultimap ,对应将 key 映射到 List 或者 Set 。

最直接构建 Multimap 的方式是使用 MultimapBuilder,这种方式允许用户自定义 key 和 value 应该有的样式,当然也可以用create()方法,这也是我最常用的方式:

 ArrayListMultimap<String, String> userSign = ArrayListMultimap.create();
 userSign.put("zhangsan", "2019-05-01");
 userSign.put("zhangsan", "2019-05-02");
 List<String> zhangsanSign = userSign.get("zhangsan");

下载了Guava的源码就可以发现,其实他里面就是用Map<String,List>来实现的,这是定义的地方:

四、value也不可以重复的双向Map-BiMap

这个数据结构比较强大了,很明显就是key和value都是不可以重复的,而且可以根据key或value来查询对方,实现了双向互查,是不是很强大?

这个类是真的实现了JDK的Map接口的,使用它必须保证key和value都没有重复值.因为他支持根据value获取key,即将HashMap的key和value进行调换。

使用方式也很简单,理解了其底层的数据结构,用起来就会很顺手:

 BiMap<String, String> m = HashBiMap.create();
 m.put("pf", "111");
 String value = m.get("pf");
 String key = m.inverse().get("111");

五、多层嵌套的Map-Table

其实这个table的底层数据结构也是工作中很常见的,就是Map<String,Map<String,Object>>的解决方案。我们工作中经常碰到多个索引一个结果的时候,直接用Map<String,Map<String,Object>>也是可以的,但实在是太难看了,不便于阅读。

Guava就基于这个原因提供了Table这个类,可以很优雅的实现这个数据结构,使用方式很简单,大家可以看下例子:

 Table<Integer, Integer, String> tt = HashBasedTable.create();
 tt.put(1, 2, "huyan");
 String name = tt.get(1, 2);
 Map<Integer, String> row = tt.row(1);
 Map<Integer, String> colum = tt.column(1);
 Set<Table.Cell<Integer, Integer, String>> ha = tt.cellSet();

看一下源码就会发现,其实Table底层也是使用两个map的嵌套实现的,但是Java语言嘛,讲究的就是一个封装,虽然我们可以自己实现,但是我们应该做的是去学习一下好的实现方法,看懂,理解并且能够在其他场景应用类似的思想,而不是每次都要自己写两个map.毕竟现成好用的轮子,在适用的场景下还是应该多多使用加深理解。

那么Guava中新增的5种集合类型就已经介绍完了,大家可以根据文中的例子好好理解下每个结构的定义,来加深理解其使用场景。

如果遗漏或者错误,欢迎指正,多谢!

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码