Google开发的Guava库功能介绍

内容分享3周前发布
0 3 0

在Java开发的项目里,我们常常需要处理各种数据结构和算法,而标准Java库虽然功能强劲,但在某些场景下仍显不足。Google开发的Guava库正是为了解决这些痛点而诞生的,它已成为Java开发者不可或缺的工具集。Guava是Google提供的一套核心Java库,包含了新的集合类型(如multimap和multiset)、不可变集合、图库,以及用于并发、I/O、哈希、原语、字符串等的实用工具!

Google开发的Guava库功能介绍

一、Guava的核心价值

Guava的核心价值在于它填补了Java标准库与实际开发需求之间的鸿沟。在Java 8之前,开发者常常需要自己实现一些常用功能,而Guava则提供了经过生产环境验证的、高效的实现方案。

1. 新集合类型:超越Java标准库

Java标准库提供了Map、List、Set等基础集合类型,但面对复杂场景时显得力不从心。Guava引入了以下几种强劲的新集合类型:

  • Multimap:一个键可以映射到多个值的映射结构,比使用Map<K, List>更加优雅和高效。
  • Multiset:类似于Set,但允许重复元素,同时提供计数功能。
  • BiMap:双向映射,即一个键可以唯一映射到一个值,同时一个值也可以唯一映射到一个键。
  • Table:二维表结构,可以用行和列的组合来索引数据。
  • Forwarding Collections:用于创建集合的装饰器,方便扩展和封装。

这些集合类型不仅简化了代码,还提高了性能,使开发者能够专注于业务逻辑而非数据结构的实现。

Google开发的Guava库功能介绍

2. 不可变集合:安全可靠的编程方式

不可变集合是Guava的另一大亮点。一旦创建,它们的内容就无法更改,这使得它们在多线程环境中特别安全,无需额外的同步机制。Guava提供了多种不可变集合的工厂方法:

List<String> immutableList = ImmutableList.of("a", "b", "c");
Set<String> immutableSet = ImmutableSet.of("a", "b", "c");
Map<String, Integer> immutableMap = ImmutableMap.of("a", 1, "b", 2, "c", 3);

不可变集合还支持链式调用和构建器模式,使代码更加简洁和可读。

3. 图库:处理复杂关系的利器

Guava的图库(Graph)为处理节点和边的关系提供了强劲支持。在社交网络分析、路径查找、依赖管理等场景中,图结构是理想的数据模型。Guava提供了两种主要的图实现:

  • MutableGraph:可修改的图
  • ImmutableGraph:不可变的图

图库支持多种遍历方式、路径查找和子图操作,大大简化了复杂关系的处理。

4. 并发工具:简化多线程编程

Java的并发工具包已经很强劲,但Guava进一步简化了常见并发场景:

  • ListenableFuture:扩展了Future,允许注册回调,简化异步操作的处理。
  • Cache:提供了高效的缓存实现,支持自动过期、加载策略等。
  • RateLimiter:用于控制资源的访问速率,防止系统过载。
  • ThreadFactoryBuilder:方便创建线程工厂,设置线程名称、优先级等。

这些工具使多线程编程更加简单、安全和高效。

5. I/O工具:简化文件和流处理

Guava提供了许多I/O相关的实用工具,简化了文件读写、流处理等常见操作:

  • Files:提供读写文件、复制文件、遍历目录等方法。
  • ByteStreams:用于处理字节流的实用方法。
  • CharStreams:用于处理字符流的实用方法。
  • Charsets:提供常用字符集的常量。

这些工具使文件操作代码更加简洁和可读。

6. 哈希、字符串和原语处理

Guava还提供了丰富的工具方法,用于处理哈希、字符串和原语类型:

  • Hashing:提供多种哈希算法,如MD5、SHA-1、SHA-256等。
  • Strings:字符串处理工具,如trim、split、pad等。
  • Objects:对象比较、toString等实用方法。
  • Primitives:原语类型(int、long等)的转换和处理。

这些工具使日常编程更加高效。

二、Guava的两个版本:JRE与Android

Guava提供了两个版本,以满足不同环境的需求:

1. JRE版本

JRE版本要求JDK 1.8或更高。它适用于标准Java应用程序,是大多数Java项目的首选。版本号格式为33.5.0-jre(当前最新版本)。

2. Android版本

Android版本专为Android平台设计,确保与Android的兼容性。版本号格式为33.5.0-android。Android版本的Guava会避免使用Android不支持的Java特性,确保在移动设备上运行良好。

三、在项目中使用Guava

1. Maven依赖

在Maven项目中,添加Guava依赖超级简单:

Google开发的Guava库功能介绍

<dependency>
  <groupId>com.google.guava</groupId>
  <artifactId>guava</artifactId>
  <version>33.5.0-jre</version> <!-- 或使用33.5.0-android用于Android -->
</dependency>

2. Gradle依赖

在Gradle项目中,添加依赖的方式如下:

dependencies {
  // 1. 仅在实现中使用Guava
  implementation("com.google.guava:guava:33.5.0-jre")
  
  // 2. 在公共API中使用Guava类型
  api("com.google.guava:guava:33.5.0-jre")
  
  // 3. Android - 仅在实现中使用Guava
  implementation("com.google.guava:guava:33.5.0-android")
  
  // 4. Android - 在公共API中使用Guava类型
  api("com.google.guava:guava:33.5.0-android")
}

注意:api和implementation的区别在于,api依赖会暴露给依赖该项目的其他模块,而implementation仅在当前模块内部使用。

四、API使用注意事项

1. @Beta注解的API

Guava中使用@Beta注解标记的API是不稳定的,可能随时更改或移除。如果你的代码是一个库(被其他项目依赖),不应直接使用@Beta API,除非你重新打包它们。强烈提议使用Guava Beta Checker来确保不使用任何@Beta API。

2. 二进制兼容性

非@Beta的API将保持二进制兼容性,这意味着你可以在不修改代码的情况下升级到新版本。Guava 21.0是最后一个移除非@Beta API的版本。

3. 序列化注意事项

Guava中所有对象的序列化形式都可能随时改变,除非特别注明。不要将序列化对象持久化并假设未来版本可以读取它们。

4. 安全思考

Guava的类不是为防止恶意调用者设计的,不应用于受信任和不受信任代码之间的通信。

五、Guava的实际应用示例

1. 使用Multimap处理多值映射

Multimap<String, String> multimap = ArrayListMultimap.create();
multimap.put("fruit", "apple");
multimap.put("fruit", "banana");
multimap.put("vegetable", "carrot");

System.out.println(multimap.get("fruit")); // [apple, banana]

2. 使用不可变集合确保数据安全

List<String> mutableList = Lists.newArrayList("a", "b", "c");
List<String> immutableList = ImmutableList.copyOf(mutableList);

// 以下代码会抛出UnsupportedOperationException
// immutableList.add("d");

3. 使用Cache实现高效缓存

Cache<String, String> cache = CacheBuilder.newBuilder()
    .maximumSize(100)
    .expireAfterWrite(10, TimeUnit.MINUTES)
    .build();

cache.put("key", "value");
String value = cache.getIfPresent("key");

4. 使用RateLimiter控制请求速率

RateLimiter rateLimiter = RateLimiter.create(5.0); // 每秒5个请求
rateLimiter.acquire(); // 阻塞直到可以获取一个令牌
// 执行操作

Guava作为Google提供的核心Java库,已经成为Java开发者的必备工具。它不仅简化了常见任务的实现,还提高了代码的可读性和可维护性。无论是处理复杂数据结构、实现高效缓存,还是简化并发编程,Guava都提供了优雅的解决方案。Guava在github上开源地址是
https://github.com/google/guava

Google开发的Guava库功能介绍

© 版权声明

相关文章

3 条评论

您必须登录才能参与评论!
立即登录
  • 头像
    不爱吃酸的莓莓 投稿者

    那guava是不是不能用来序列化数据,还是要用java自带的类型?

    无记录
  • 头像
    青川游戏 投稿者

    别介绍了 哪天特朗普颁发一个政策 不给你用了 到时候又得换

    无记录
  • 头像
    上海国际展 读者

    收藏了,感谢分享

    无记录