com.google.guava(谷歌Guava , 读音:/ˈɡwɑːvə/,中文谐音:瓜 --- 沃(重音在前面))是Google官方开源的Java核心工具库 ,核心作用是补充JDK原生API的不足,简化高频开发场景的代码,提升代码可读性、性能和安全性------可以把它理解为"比Hutool更偏向底层、更适配Google工程实践的Java工具库",是Java后端开发中几乎必备的基础依赖。
一、Guava的核心价值(为什么要用它?)
JDK原生API存在很多"反人类"设计:比如集合操作繁琐、空指针处理麻烦、字符串拼接低效、并发工具难用等。Guava针对这些痛点做了极致优化,且经过Google海量业务验证,稳定性和性能远超手写工具类。
二、核心功能模块(高频使用场景)
| 模块/工具类 | 核心功能 | 解决JDK痛点 |
|---|---|---|
| 不可变集合(ImmutableXXX) | ImmutableList/ImmutableMap/ImmutableSet,创建不可变、线程安全的集合 | JDK的Collections.unmodifiableXXX是"假不可变"(底层仍可修改) |
| 新集合类型 | Multimap(一键多值Map)、Multiset(可计数集合)、BiMap(双向Map)等 | JDK Map只能一键一值,计数需手动统计 |
| 字符串工具(Strings) | 空值判断(isNullOrEmpty)、安全拼接、前缀/后缀处理等 |
JDK String操作需手动判空,拼接低效 |
| 缓存工具(Cache) | 本地缓存(LoadingCache),支持自动过期、最大容量、加载回调等 | JDK无原生本地缓存,手写缓存易内存泄漏 |
| 并发工具(ListenableFuture) | 可监听的Future,支持回调式异步编程,替代JDK原生Future的阻塞式获取 | JDK Future只能阻塞/轮询获取结果 |
| 前置条件检查(Preconditions) | 简化参数校验(checkNotNull/checkArgument),替代手写if-else判空 |
参数校验代码冗余,异常信息不友好 |
| IO工具(Files/ByteStreams) | 简化文件/流操作,一行读写文件、关闭流(无需try-catch-finally) | JDK IO代码繁琐,需手动关闭资源 |
三、实用代码示例(对比JDK,看差距)
1. 不可变集合(线程安全,避免修改)
Java
// JDK 原生(假不可变,底层修改仍会影响)
List<String> jdkList = new ArrayList<>();
jdkList.add("a");
List<String> unmodifiableList = Collections.unmodifiableList(jdkList);
jdkList.add("b"); // unmodifiableList也会包含"b",不安全
// Guava 不可变集合(真不可变,创建后无法修改)
ImmutableList<String> guavaList = ImmutableList.of("a", "b", "c");
// guavaList.add("d"); // 直接抛UnsupportedOperationException,从根源杜绝修改
ImmutableMap<Integer, String> guavaMap = ImmutableMap.of(1, "a", 2, "b");
2. 一键多值Map(Multimap,替代Map<String, List>)
Java
// JDK 原生(需手动创建List,代码繁琐)
Map<String, List<String>> jdkMap = new HashMap<>();
if (!jdkMap.containsKey("user1")) {
jdkMap.put("user1", new ArrayList<>());
}
jdkMap.get("user1").add("role1");
jdkMap.get("user1").add("role2");
// Guava Multimap(一键多值,自动管理List)
Multimap<String, String> guavaMultimap = ArrayListMultimap.create();
guavaMultimap.put("user1", "role1");
guavaMultimap.put("user1", "role2");
// 直接获取所有值:[role1, role2]
Collection<String> roles = guavaMultimap.get("user1");
3. 参数校验(Preconditions,简化判空)
Java
// JDK 原生(代码冗余,异常信息不清晰)
public void addUser(Long userId, String name) {
if (userId == null) {
throw new IllegalArgumentException("userId不能为空");
}
if (name == null || name.isEmpty()) {
throw new IllegalArgumentException("name不能为空或空字符串");
}
// 业务逻辑
}
// Guava Preconditions(一行搞定,异常信息更规范)
public void addUser(Long userId, String name) {
Preconditions.checkNotNull(userId, "userId不能为空");
Preconditions.checkArgument(!Strings.isNullOrEmpty(name), "name不能为空或空字符串");
// 业务逻辑
}
4. 本地缓存(LoadingCache,替代手写缓存)
Java
// Guava 本地缓存(自动加载、过期、限制容量)
LoadingCache<Long, User> userCache = CacheBuilder.newBuilder()
.maximumSize(1000) // 最大缓存1000条
.expireAfterWrite(10, TimeUnit.MINUTES) // 写入后10分钟过期
.build(new CacheLoader<Long, User>() {
// 缓存未命中时,自动调用此方法加载数据
@Override
public User load(Long userId) throws Exception {
return userService.getUserById(userId); // 从数据库/接口加载
}
});
// 使用缓存(无需手动判断是否存在,自动加载)
User user = userCache.get(1001); // 命中则返回缓存,未命中则调用load方法
四、Guava vs Hutool(你之前问过的工具库)
很多人会对比两者,核心区别:
| 维度 | Guava | Hutool |
|---|---|---|
| 定位 | 底层工具库,适配Google工程实践 | 业务工具库,适配国内开发场景 |
| 核心优势 | 集合、并发、缓存、不可变数据 | 日期、加密、HTTP、脱敏(本土化) |
| 适用场景 | 框架开发、高性能服务 | 业务系统、快速开发 |
| 依赖体积 | 较小(核心包约3MB) | 全量包约5MB |
五、使用注意事项
-
版本兼容:Guava 31.0+ 要求Java 8+,和Spring Boot 4.0.*完全兼容;
-
引入方式(Maven):
XML<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>32.1.3-jre</version> <!-- 稳定版 --> </dependency> -
避免过度使用:Guava的部分工具(如Optional)在Java 8+已被原生API替代,优先用JDK原生,Guava作为补充。
总结
-
Guava是Google出品的Java核心工具库,核心解决JDK原生API繁琐、不安全、性能差的问题;
-
高频使用场景:不可变集合、一键多值Map、本地缓存、参数校验、并发编程;
-
它和Hutool互补而非替代------Guava偏底层/通用,Hutool偏业务/本土化,实际开发中常同时引入。
(注:文档部分内容由 AI 生成)