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

一、Guava的核心价值
Guava的核心价值在于它填补了Java标准库与实际开发需求之间的鸿沟。在Java 8之前,开发者常常需要自己实现一些常用功能,而Guava则提供了经过生产环境验证的、高效的实现方案。
1. 新集合类型:超越Java标准库
Java标准库提供了Map、List、Set等基础集合类型,但面对复杂场景时显得力不从心。Guava引入了以下几种强劲的新集合类型:
- Multimap:一个键可以映射到多个值的映射结构,比使用Map<K, List>更加优雅和高效。
- Multiset:类似于Set,但允许重复元素,同时提供计数功能。
- BiMap:双向映射,即一个键可以唯一映射到一个值,同时一个值也可以唯一映射到一个键。
- Table:二维表结构,可以用行和列的组合来索引数据。
- Forwarding Collections:用于创建集合的装饰器,方便扩展和封装。
这些集合类型不仅简化了代码,还提高了性能,使开发者能够专注于业务逻辑而非数据结构的实现。

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依赖超级简单:

<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




那guava是不是不能用来序列化数据,还是要用java自带的类型?
别介绍了 哪天特朗普颁发一个政策 不给你用了 到时候又得换
收藏了,感谢分享