Google 开源库Guava详解

一、概述

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、不可变集合优点

不可变对象具有许多优点,包括:

  1. 不受信任的库可以安全使用。
  2. 线程安全:可以由许多线程使用,没有竞争条件的风险。
  3. 不需要支持突变,并且可以通过该假设节省时间和空间。所有不可变集合实现都比其可变同级更节省内存。(分析)
  4. 可以用作常量,预期它将保持固定。

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 |

相关推荐
咖猫3 天前
Guava 库中的 `Multimap` 是一个允许一个键对应多个值的集合 Guava `Multimap` 的基本代码示例:
开发语言·python·guava
咖猫3 天前
Google guava 最佳实践 学习指南之08 `BiMap`(双向映射)
java·开发语言·guava
小沈同学呀3 天前
Java 本地缓存实现:Guava Cache、Caffeine、Ehcache 和 Spring Cache
java·缓存·guava·caffeine·ehcache
程序无涯海4 天前
【Java技巧】深入浅出 Guava Retry 框架:业务兜底重试方案示例
java·开发语言·编程·guava·重试
咖猫7 天前
Guava 提供了集合操作 `List`、`Set` 和 `Map` 三个工具类
windows·list·guava
咖猫7 天前
Guava库中的`ImmutableCollections`进行集合操作的示例
java·开发语言·guava
咖猫7 天前
google 的guava 学习 基本工具类
学习·guava
咖猫8 天前
Guava 库中的 `Multiset` 是一个允许元素重复的集合
开发语言·python·guava
u01005596017 天前
guava缓存的get方法的回调函数讲解一下
java·缓存·guava
乘风而来的思绪18 天前
【系统设计】高可用之各种缓存对比
java·redis·缓存·guava·memcachaed·tair·evcache