文章来源:https://c1n.cn/gST6P

目录

  • Google Guava 概述

  • 不可变集合与对象

  • Guava 新集合类型

  • JDK 集合辅助工具类

  • JDK 基本类型辅助工具类

  • JDK 字符串辅助工具类

  • Stopwatch 秒表

Google Guava 概述

Guava 是一组来自 Google 的核心 Java 库,包括新的集合类型(如 multimap 和 multiset)、不可变集合、图形库以及用于并发、I/O、散列、缓存、原语、字符串等的实用程序!

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

guava github 开源地址:

https://github.com/google/guava

官网用户手册:

https://github.com/google/guava/wiki

com.google.guava 依赖:

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

不可变集合与对象

①制作对象的不可变副本是一种很好的防御性编程技术,不可变对象有许多优点。

包括:

  • 可供不受信任的库安全使用。

  • 线程安全:可由多个线程使用,无争用风险。

  • 不需要支持突变,并且可以节省时间和空间,所有不可变的集合实现都比它们的可变同级更节省内存。

  • 可以用作常数,并期望它将保持不变。

②要点:每个 Guava 不可变集合实现都拒绝 null 值。Guava 的设计上推荐使用 null 值,大多数情况下,遇到 null 值会抛异常。

③一个不可变的 ImmutableXxx 集合可以通过以下几种方式创建。

如:

  • 使用 copyOf 方法,如 ImmutableSet.copyOf(set)

  • 使用 of 方法,如 ImmutableSet.of("a", "b", "c") 或 ImmutableMap.of("a", 1, "b", 2)

  • 使用 Builder 方法

④Guava 为 java jdk 每种标准集合类型提供了简单易用的不可变版本,包括 Guava 自己的集合变体,为 java 提供的不可变版本都是继承 java jdk 的接口而来,所以操作上基本无异。

下面接口的实现类也都有对应的不可变版本:

Guava 新集合类型

Guava 引入了许多新的集合类型,这些类型不在 Java JDK 中,但却非常有用,这些都是为了与 JDK 集合框架愉快地共存而设计的,而不是将东西塞进 JDK 集合抽象中。

| Multiset 可重复集合

①Guava 提供了一个新的集合类型 Multiset,它支持添加多个相同的元素,其中成员可以出现不止一次。

②Multiset 相当于 Set,区别在于 Multiset 可添加相同的元素,它的内部使用一个 HashMap 来维护。

③Multiset 也有自己的实现类,常用的有 HashMultiset、LinkedHashMultiset、TreeMultiset 等。

HashMultiset 、TreeMultiset 是无序的,LinkedHashMultiset 是有序的,操作完全同理 JDK 的 HashSet、TreeSet、LinkedHashSet。

| Multimap 多重映射

①每个有经验的 Java 程序员都曾在某个地方实现过 Map<K、List> 或 Map<K、Set>。

Guava 的 Multimap 框架使处理从键到多个值的映射变得容易,多重映射是将键与任意多个值关联的一种通用方法。

②从概念上讲,有两种方法可以将多重映射视为从单个键到单个值的映射的集合:

③Multimap 提供了多种实现:

④除了不可变的实现之外,每个实现都支持空键和值。并不是所有的实现都是作为一个Map<K,Collection> 实现的(特别是一些 Multimap 实现使用自定义哈希表来最小化开销。)

| BiMap 双向映射

①将值映射回键的传统方法是维护两个独立的映射,并使它们保持同步,但这很容易产生错误,并且当映射中已经存在一个值时,可能会非常混乱。

例如:

Map<String, Integer> nameToId = Maps.newHashMap();
Map<Integer, String> idToName = Maps.newHashMap();nameToId.put("Bob", 42);
idToName.put(42, "Bob");

②BiMap 提供了多种实现:

| Table 表结构数据

①当试图一次在多个键上建立索引时,您将得到类似 Map<FirstName,Map<LastName,Person>> 的代码,这很难看,而且使用起来很尴尬。

Guava 提供了一个新的集合类型 Table,它支持任何“row”类型和“column”类型的这个用例。

②Table 提供了多种实现:

HashBasedTable:基本上是由 HashMap<R,HashMap<C,V>> 支持的。TreeBasedTable:基本上是由 TreeMap<R,TreeMap<C,V>> 支撑的。ImmutableTableArrayTable:要求在构造时指定行和列的完整范围,但在表密集时由二维数组支持以提高速度和内存效率,ArrayTable的工作原理与其他实现有些不同

| ClassToInstanceMap 类型映射到实例

①有时 key 并不是单一的类型,而是多种类型,Guava 为此提供了 ClassToInstanceMap,key 可以是多种类型,value 是此类型的实例。

②ClassToInstanceMap 的实现有:MutableClassToInstanceMap 和 ImmutableClassToInstanceMap 的实现。

JDK 集合辅助工具类

①任何有 JDK 集合框架经验的程序员都知道并喜欢其中提供的实用程序 java.util.Collections,Guava 提供了许多适用于集合的静态方法实用程序。

JDK 基本类型辅助工具类

Guava 为 Java JDK 的基本类型提供了实用程序类:

其他类型同理。

JDK 字符串辅助工具类

①Strings 类中提供了少数几个常用的符串实用程序。

②Joiner 是连接器,用于连接 java.lang.Iterable、java.util.Iterator、java.lang.Object[] 中的元素。在线演示源码。

③Splitter 是分割器,用于分割字符序列 java.lang.CharSequence。

④CharMatcher 字符匹配器,用于匹配字符,可以将 CharMatcher 视为代表一类特定的字符,如数字或空白。

Stopwatch 秒表

①google 的秒表 Stopwatch 相比 Spring framewrk core 包 和 apache commons lang3 包的秒表是最方便使用的。

②此类不是线程安全的。

/*** Stopwatch createStarted():创建(并启动)一个新的秒表,使用 System#nanoTime 来作为其时间源。* Stopwatch createUnstarted():创建(但不启动)一个新的秒表,使用 System#nanoTime 来作为其时间源。* long elapsed(TimeUnit desiredUnit):返回此秒表上显示的当前已用时间,以所需的时间单位表示,任何分数向下舍入* boolean isRunning():如果已在此秒表上调用start()},并且自上次调用start()以来未调用stop(),则返回true* Stopwatch reset():将此秒表的运行时间设置为零,并将其置于停止状态。* Stopwatch start():启动秒表,如果秒表已经在运行,则 IllegalStateException* Stopwatch stop():停止秒表,将来的读取将返回到目前为止经过的固定持续时间。* tring toString():返回当前运行时间的字符串表示形式,比如 2.588 s,106.8 ms*/@Testpublic void testStopwatch() throws InterruptedException {SecureRandom secureRandom = new SecureRandom();Stopwatch stopwatch = Stopwatch.createStarted();int nextInt = secureRandom.nextInt(2000);System.out.println("任务1预算耗时:" + nextInt);//任务1预算耗时:81TimeUnit.MILLISECONDS.sleep(nextInt);System.out.println("\t任务1实际耗时:" + stopwatch.elapsed(TimeUnit.MILLISECONDS) + "(毫秒)");//    任务1实际耗时:563(毫秒)stopwatch.reset().start();nextInt = secureRandom.nextInt(4000);System.out.println("任务2预算耗时:" + nextInt);//任务2预算耗时:1591TimeUnit.MILLISECONDS.sleep(nextInt);System.out.println("\t任务2实际耗时:" + stopwatch.toString());//    任务2实际耗时:1.592 sstopwatch.reset().start();nextInt = secureRandom.nextInt(3000);System.out.println("任务3预计耗时:" + nextInt);//任务3预计耗时:1964TimeUnit.MILLISECONDS.sleep(nextInt);System.out.println("\t任务3实际耗时:" + stopwatch.stop().toString());//    任务3实际耗时:1.965 s}
-------------  END  -------------
扫码免费获取600+页石杉老师原创精品文章汇总PDF原创技术文章汇总点个在看你最好看

Guava工具类真心好用,无须重复轮子!相关推荐

  1. Java Guava工具类的使用

    Guava工具类简介 在开发中,工具类的使用避免上重复造轮子,极大的节省了开发时间,提高了工作效率,Google公司提供的Guava工具类,高效设计良好的API,遵循高效的java语法,使代码更加简洁 ...

  2. 谷歌Guava工具类的使用(1):BloomFilter的使用

    谷歌Guava工具类的使用(1):BloomFilter的使用 具体代码实现如下所示: // 创建布隆过滤器,设置存储的数据类型,预期数据量,误判率 (必须大于0,小于1) int insertion ...

  3. java工具谷歌工具-Google guava工具类的介绍和使用

    工具类 就是封装平常用的方法,不需要你重复造轮子,节省开发人员时间,提高工作效率.谷歌作为大公司,当然会从日常的工作中提取中很多高效率的方法出来.所以就诞生了guava. guava的优点: 高效设计 ...

  4. Java中使用UUID工具类生成唯一标志防止重复

    场景 UUID 是指Universally Unique Identifier,翻译为中文是通用唯一识别码,UUID 的目的是让分布式系统中的所有元素都能有唯一的识别信息. 在某些场景下需要给数据库中 ...

  5. uuid java 重复_Java中使用UUID工具类生成唯一标志防止重复

    import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.secur ...

  6. JAVA 16位ID生成工具类含16位不重复的随机数数字+大小写

    package com.fty.util;import java.security.SecureRandom; import java.util.Random; import java.util.co ...

  7. 几行代码就能实现复杂的 Excel 导入导出,这个工具类真心强大!

    点击关注公众号,实用技术文章及时了解 功能介绍 IMPORT ExcelHandle 核心处理器 ExcelWorkbookManage excel所有工作表管理 ExcelInitConfig 配置 ...

  8. [Google Guava] 2.3-强大的集合工具类:java.util.Collections中未包含的集合工具

    原文链接 译文链接 译者:沈义扬,校对:丁一 尚未完成: Queues, Tables工具类 任何对JDK集合框架有经验的程序员都熟悉和喜欢java.util.Collections包含的工具方法.G ...

  9. Guava常用工具类的使用

    导航 引言 一.Lists.partition 引言 本文用于记录工作中常用到的 Guava 工具类的使用. 依赖引入: <dependency><groupId>com.go ...

最新文章

  1. pyinstaller 工具起步
  2. Git叉子实际上是Git克隆吗?
  3. linux终端获取root,ubuntu18.04获取root权限并用root用户登录的实现
  4. java date 最小值_java – Datepicker和timepicker – 设置最大值和最小值
  5. error: implicit declaration of function ‘read‘ [-Werror,-Wimplicit-function-declaration]
  6. JavaScript BOM 随笔谈
  7. 软件开发需求分析规范
  8. OCR如何识别PDF图片中的文字
  9. 手机定位--GPS定位,基站定位,辅助定位
  10. 索尼a6000拍月亮_如何给月亮拍好照片
  11. 身份证识别技术方案介绍
  12. LHG 弹层问题汇总
  13. 微信小程序实现:输入手机号点击按钮查询手机号归属地
  14. 人工智能都可以写代码了,程序员怎么做才能不被时代淘汰?
  15. 修改apt-get服务器,云服务器使用sudo apt-get update 失败的原因及解决方法(unubtu下)...
  16. 计算机教室布置软木,软木照片墙布置,让孩子体验手工的乐趣
  17. EN 45545-2:2020 T11烟毒性检测简介
  18. week 4 hw TT的神秘礼物 二分答案
  19. 精心推荐8款实用国产软件,非常强大
  20. 妙用 Java 8 中的 Function 接口,消灭 if...else(非常新颖的写法)

热门文章

  1. 用于业务的精炼js工具函数(浏览器环境)
  2. 文献阅读(166)鲲鹏
  3. 【Python知识点梳理】10.Python的垃圾回收机制、代码规范及命令行参数
  4. g140wc研究总结
  5. WebService之通讯协议:SOAP
  6. 三个故事带你快速理解C、C++、C#的区别!
  7. C语言简单链表详细步骤详解
  8. 【windows】 Win10笔记本开机输入密码后黑屏解决方案
  9. 为产业AI去障:联想的边缘突破
  10. Vegas媒体生成器如何使用