Google Guava 概述
1、Guava 是一组来自 Google 的外围 Java 库,包含新的汇合类型(如 multimap 和 multiset)、不可变汇合、图形库以及用于并发、I/O、散列、缓存、原语、字符串等的实用程序!被广泛应用于 Google 的大多数 Java 我的项目中,也被许多其余公司宽泛应用。
2、guava github 开源地址:GitHub – google/guava:
https://github.com/google/guava
3、官网用户手册
https://github.com/google/gua…
4、com.google.guava 依赖:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>29.0-jre</version>
</dependency>
不可变汇合与对象
1、制作对象的不可变正本是一种很好的防御性编程技术,不可变对象有许多长处,包含:
- 可供不受信赖的库平安应用。
- 线程平安:可由多个线程应用,无争用危险。
- 不须要反对渐变,并且能够节省时间和空间,所有不可变的汇合实现都比它们的可变同级更节俭内存。
- 能够用作常数,并冀望它将放弃不变。
2、要点:每个 Guava 不可变汇合实现都回绝 null 值。Guava 的设计上举荐应用 null 值,大多数状况下,遇到 null 值会抛异样.
3、一个不可变的 ImmutableXxx
汇合能够通过以下几种形式创立:
- 应用 copyOf 办法,如
ImmutableSet.copyOf(set)
- 应用 of 办法, 如
ImmutableSet.of("a", "b", "c")
或ImmutableMap.of("a", 1, "b", 2)
- 应用 Builder 办法,。
4、Guava 为 java jdk 每种规范汇合类型提供了简略易用的不可变版本,包含 Guava 本人的汇合变体,为 java 提供的不可变版本都是继承 java jdk 的接口而来,所以操作上根本无异。上面接口的实现类也都有对应的不可变版本。
接口 | JDK 或者 Guava | 不可变版本 |
---|---|---|
Collection | JDK | ImmutableCollection |
List | JDK | ImmutableList |
Set | JDK | ImmutableSet |
SortedSet/NavigableSet | JDK | ImmutableSortedSet |
Map | JDK | ImmutableMap |
SortedMap | JDK | ImmutableSortedMap |
Multiset | Guava | ImmutableMultiset |
SortedMultiset | Guava | ImmutableSortedMultiset |
Multimap | Guava | ImmutableMultimap |
ListMultimap | Guava | ImmutableListMultimap |
SetMultimap | Guava | ImmutableSetMultimap |
BiMap | Guava | ImmutableBiMap |
ClassToInstanceMap | Guava | ImmutableClassToInstanceMap |
Table | Guava | ImmutableTable |
在线演示源码:
https://github.com/main/java/…
官网文档
https://github.com/google/gua…
举荐一个 Spring Boot 基础教程及实战示例:
https://github.com/javastacks…
Guava 新汇合类型
1、Guava 引入了许多新的汇合类型,这些类型不在 Java JDK 中,但却十分有用,这些都是为了与 JDK 汇合框架欢快地共存而设计的,而不是将货色塞进 JDK 汇合形象中。
Multiset 可反复汇合
1、Guava 提供了一个新的汇合类型 Multiset,它反对增加多个雷同的元素,其中成员能够呈现不止一次。
2、Multiset 相当于 Set,区别在于 Multiset 可增加雷同的元素,它的外部应用一个 HashMap 来保护,
3、Multiset 也有本人的实现类,罕用的有 HashMultiset、LinkedHashMultiset、TreeMultiset 等,HashMultiset、TreeMultiset 是无序的,LinkedHashMultiset 是有序的,操作齐全同理 JDK 的 HashSet、TreeSet、LinkedHashSet。
在线演示源码
https://github.com/wangmaoxio…
Multimap 多重映射
1、每个有教训的 Java 程序员都曾在某个中央实现过 Map<K、List<V>>
或 Map<K、Set<V>>
,Guava 的 Multimap
框架使解决从键到多个值的映射变得容易,多重映射是将键与任意多个值关联的一种通用办法。
2、从概念上讲,有两种办法能够将多重映射视为从单个键到单个值的映射的汇合:
3、Multimap 提供了多种实现:
Multimap | 实现 key 应用的是 | value 应用的是 |
---|---|---|
ArrayListMultimap | HashMap | ArrayList |
HashMultimap | HashMap | HashSet |
LinkedListMultimap * | LinkedHashMap* | LinkedList* |
LinkedHashMultimap** | LinkedHashMap | LinkedHashSet |
TreeMultimap | TreeMap | TreeSet |
ImmutableListMultimap | ImmutableMap | ImmutableList |
ImmutableSetMultimap | ImmutableMap | ImmutableSet |
4、除了不可变的实现之外,每个实现都反对空键和值。并不是所有的实现都是作为一个 Map<K,Collection<V>>
实现的(特地是一些 Multimap 实现应用自定义哈希表来最小化开销。)
在线演示源码
https://github.com/wangmaoxio…
举荐一个 Spring Boot 基础教程及实战示例:
https://github.com/javastacks…
BiMap 双向映射
1、将值映射回键的传统办法是保护两个独立的映射,并使它们放弃同步,但这很容易产生谬误,并且当映射中曾经存在一个值
Map<String, Integer> nameToId = Maps.newHashMap();
Map<Integer, String> idToName = Maps.newHashMap();
nameToId.put("Bob", 42);
idToName.put(42, "Bob");
2、BiMap 提供了多种实现:
键值映射实现 | 值键映射实现 | 对应 BiMap |
---|---|---|
HashMap | HashMap | HashBiMap |
ImmutableMap | ImmutableMap | ImmutableBiMap |
EnumMap | EnumMap | EnumBiMap |
EnumMap | HashMap | EnumHashBiMap |
在线演示源码:
https://github.com/wangmaoxio…
Table 表构造数据
1、当试图一次在多个键上建设索引时,您将失去相似 Map<FirstName,Map<LastName,Person>>
的代码,这很难看,而且应用起来很难堪。Guava 提供了一个新的汇合类型 Table,它反对任何“row”类型和“column”类型的这个用例。
2、Table 提供了多种实现:
- HashBasedTable:基本上是由
HashMap<R,HashMap<C,V>>
反对的。 - TreeBasedTable:基本上是由
TreeMap<R,TreeMap<C,V>>
撑持的。 - ImmutableTable
- ArrayTable:要求在结构时指定行和列的残缺范畴,但在表密集时由二维数组反对以进步速度和内存效率,ArrayTable 的工作原理与其余实现有些不同
在线演示源码:
https://github.com/wangmaoxio…
ClassToInstanceMap 类型映射到实例
1、有时 key 并不是繁多的类型,而是多种类型,Guava 为此提供了 ClassToInstanceMap
,key 能够是多种类型,value 是此类型的实例。
2、ClassToInstanceMap 的实现有:MutableClassToInstanceMap
和 ImmutableClassToInstanceMap
的实现。
在线演示源码:
https://github.com/wangmaoxio…
JDK 汇合辅助工具类
1、任何有 JDK 汇合框架教训的程序员都晓得并喜爱其中提供的实用程序 java.util.Collections
,Guava 提供了许多实用于汇合的静态方法实用程序。
接口 | 属于 JDK 还是 Guava | 对应 Guava API |
---|---|---|
Collection | JDK | Collections2 |
List | JDK | Lists |
Set | JDK | Sets |
SortedSet | JDK | Sets |
Map | JDK | Maps |
SortedMap | JDK | Maps |
Queue | JDK | Queues |
Multiset | Guava | Multisets |
Multimap | Guava | Multimaps |
BiMap | Guava | Maps |
Table | Guava | Tables |
Lists 在线演示:
https://github.com/wangmaoxio…
Sets 在线演示:
https://github.com/wangmaoxio…
JDK 根本类型辅助工具类
1、Guava 为 Java JDK 的根本类型提供了实用程序类:
根本类型 | Guava 辅助工具类 |
---|---|
byte | Bytes, SignedBytes, UnsignedBytes |
short | Shorts |
int | Ints, UnsignedInteger, UnsignedInts |
long | Longs, UnsignedLong, UnsignedLongs |
float | Floats |
double | Doubles |
char | Chars |
boolean | Booleans |
nts 在线演示源码:
https://github.com/wangmaoxio…
doubles 在线演示源码:
https://github.com/src/main/j…
booleans 在线演示源码:
https://github.com/src/main/j…
其它类型同理。
JDK 字符串辅助工具类
1、Strings 类中提供了少数几个罕用的符串实用程序。
在线演示源码:https://github.com/wangmaoxio…
2、Joiner 是连接器,用于连贯 java.lang.Iterable
、java.util.Iterator
、java.lang.Object[]
中的元素。
在线演示源码:https://github.com/wangmaoxio…
3、Splitter 是分割器,用于宰割字符序列 java.lang.CharSequence
。
在线演示源码:https://github.com/wangmaoxio…
4、CharMatcher 字符匹配器,用于匹配字符,能够将 CharMatcher 视为代表一类特定的字符,如数字或空白。留神:CharMatcher 只解决 char 值。
在线演示源码:https://github.com/wangmaoxio…
Stopwatch 秒表
1、google 的秒表 Stopwatch 相比 Spring framewrk core
包 和 apache commons lang3
包的秒表是最方便使用的。
2、此类不是线程平安的。
/**
* 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
*/
@Test
public void testStopwatch() throws InterruptedException {SecureRandom secureRandom = new SecureRandom();
Stopwatch stopwatch = Stopwatch.createStarted();
int nextInt = secureRandom.nextInt(2000);
System.out.println("工作 1 估算耗时:" + nextInt);// 工作 1 估算耗时:81
TimeUnit.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 估算耗时:1591
TimeUnit.MILLISECONDS.sleep(nextInt);
System.out.println("\t 工作 2 理论耗时:" + stopwatch.toString());// 工作 2 理论耗时:1.592 s
stopwatch.reset().start();
nextInt = secureRandom.nextInt(3000);
System.out.println("工作 3 预计耗时:" + nextInt);// 工作 3 预计耗时:1964
TimeUnit.MILLISECONDS.sleep(nextInt);
System.out.println("\t 工作 3 理论耗时:" + stopwatch.stop().toString());// 工作 3 理论耗时:1.965 s
}
感觉不错,就用起来吧!
版权申明:本文为 CSDN 博主「蚩尤后嗣」的原创文章,遵循 CC 4.0 BY-SA 版权协定,转载请附上原文出处链接及本申明。原文链接:https://blog.csdn.net/wangmx1…
近期热文举荐:
1.1,000+ 道 Java 面试题及答案整顿(2022 最新版)
2. 劲爆!Java 协程要来了。。。
3.Spring Boot 2.x 教程,太全了!
4. 别再写满屏的爆爆爆炸类了,试试装璜器模式,这才是优雅的形式!!
5.《Java 开发手册(嵩山版)》最新公布,速速下载!
感觉不错,别忘了顺手点赞 + 转发哦!