一、概述
Guava 是一组来自Google的核心Java库,包括新的集合类型(如多映射和多集)、不可变集合、图库和并发、I/O、哈希、原语、字符串等实用程序!它广泛用于Google中的大多数Java项目,也被许多其他公司广泛使用。
Guava 开发要求 :
JRE风格需要JDK 1.8或更高版本。
如果您需要支持Android,请使用Android风格。您可以在Android目录中找到Android Guava源代码。
guava github 开源地址:GitHub - google/guava: https://github.com/google/guava
官网用户手册:https://github.com/google/guava/wiki
guava 的Maven groupID是com.google.Guava,其artifact ID是guava。Guava提供了两种不同的"风格":一种用于(Java 8+)JRE,另一种用于Android或任何希望与Android兼容的库。这些口味在Maven版本字段中指定为32.1.2-jre或32.1.2-安卓。
com.google.guava 依赖:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>32.1.2-jre</version>
<!-- or, for Android: -->
<version>32.1.2-android</version>
</dependency>
二、使用Guava
Guava项目包含我们在基于Java的项目中依赖的几个Google核心库:集合、缓存、原语支持、并发库、通用注释、字符串处理、I/O等。这些工具中的每一个确实每天都被谷歌人用于生产服务。
但浏览Javadoc并不总是学习如何最好地利用库的最有效方法。
基本使用:
- 使用和避免null:null可能是模棱两可的,可能会导致令人困惑的错误,有时只是令人不快。许多Guava公用事业拒绝并在空值上快速失败,而不是盲目接受它们。
- 先决条件:更容易地测试方法的先决条件。
- 通用对象方法:简化object方法的实现,如hashCode()和toString()。
- Ordering:Guava强大的"流畅比较器"类。
- Throwables:简化传播和检查异常和错误。
Collections:Guava对JDK收藏生态系统的扩展。这些是番石榴最成熟和最受欢迎的部分。
- 不可变集合,用于防御编程、常量集合和提高的效率。
- 新的集合类型,用于JDK集合不能很好地处理的用例:多集合、多映射、表、双向映射等。
- 强大的收集实用程序,用于java.util.Collections中未提供的常见操作。
- 扩展实用程序:编写集合装饰器?实现迭代器?我们可以让这变得更容易。
图:用于建模图结构数据的库,即实体及其之间的关系。主要功能包括:
- 图:其边是匿名实体的图,没有自己的标识或信息。
- ValueGraph:其边具有关联的非唯一值的图。
- 网络:其边是唯一对象的图。
- 支持可变和不可变、有向和无向的图以及其他几个属性。
缓存 :本地缓存,处理得当,并支持各种过期行为。
功能习语 :谨慎使用,Guava的功能习语可以显著简化代码。
并发:强大、简单的抽象,使编写正确的并发代码变得更容易
- ListenableFuture:Futures,完成时回调。
- 服务:启动和关闭的东西,为您处理困难的状态逻辑。
String :一些非常有用的字符串实用程序:拆分、连接、填充等。
Primitive :JDK不提供的对基本体类型(如int和char)的操作,包括某些类型的无符号变体。
范围 :Guava强大的API,用于处理可比较类型的范围,包括连续和离散。
I/O :简化了Java 5和6的I/O操作,特别是在整个I/O流和文件上。
哈希 :用于比Object.hashCode()提供的更复杂哈希的工具,包括Bloom过滤器。
EventBus :在组件之间发布订阅样式的通信,而不要求组件彼此显式注册。
Math :JDK未提供的优化、经过彻底测试的数学实用程序。
反射:用于Java反射功能的Guava实用程序。
三、不可变集合
1、例子
public static final ImmutableSet<String> COLOR_NAMES = ImmutableSet.of(
"red",
"orange",
"yellow",
"green",
"blue",
"purple");
class Foo {
final ImmutableSet<Bar> bars;
Foo(Set<Bar> bars) {
this.bars = ImmutableSet.copyOf(bars); // defensive copy!
}
}
2、不可变集合优点
不可变对象具有许多优点,包括:
- 不受信任的库可以安全使用。
- 线程安全:可以由许多线程使用,没有竞争条件的风险。
- 不需要支持突变,并且可以通过该假设节省时间和空间。所有不可变集合实现都比其可变同级更节省内存。(分析)
- 可以用作常量,预期它将保持固定。
3、不可变集合使用
ImmutableXXX集合可以通过几种方式创建:
-
使用copyOf方法,例如ImmutableSet.copyOf(set)
-
使用of方法,例如,ImmutableSet.of("a","b","c")或ImmutablesMap.of(("a",1,"b",2)
-
例如,使用生成器,
public static final ImmutableSet<Color> GOOGLE_COLORS =
ImmutableSet.<Color>builder()
.addAll(WEBSAFE_COLORS)
.add(new Color(0, 191, 255))
.build();
Guava 为 java jdk 每种标准集合类型提供了简单易用的不可变版本,包括 Guava 自己的集合变体,为 java 提供的不可变版本都是继承 java jdk 的接口而来,所以操作上基本无异。下面接口的实现类也都有对应的不可变版本。
|------------------------|---------------|-----------------------------|
| Interface | JDK or Guava? | Immutable Version |
| 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 |