直接在pom.xml的<dependencies>内添加Guava依赖即可,推荐使用最新LTS版如32.1.3-jre;若项目用Spring Boot 3.x需显式声明覆盖默认旧版,避免NoSuchMethodError。

怎么把Guava加进Maven项目
直接在 pom.xml 里加依赖就行,别手动下载jar丢进lib——那是十年前的老办法,现在容易漏传递依赖、版本冲突也难排查。
Guava的坐标稳定,推荐用最新LTS版(比如 32.1.3-jre),别用 -android 后缀的,除非你真在写Android应用(它阉割了JDK8+特性)。
- 确认
<dependency>块写在<dependencies>内,不是外面套了个错层 - 如果项目用了Spring Boot 3.x,默认父POM可能已带旧版Guava(如31.x),得显式声明覆盖,否则
ImmutableList.of()可能报NoSuchMethodError - IDE没自动刷新依赖?右键项目 → “Maven” → “Reload project”,别硬等
Gradle里引入Guava为什么编译不通过
常见原因是用了 implementation 但代码里调了 com.google.common.collect.ImmutableSet 这类类,而模块没导出包——其实不是Guava的问题,是你的模块-info.java 没声明 requires com.google.common;。
更大概率是你在Java 9+模块项目里混用了非模块化jar(Guava至今没提供 module-info.class),这时候得加 --add-modules=ALL-SYSTEM 启动参数,或者干脆别开模块系统(删掉 module-info.java)。
立即学习“Java免费学习笔记(深入)”;
- Gradle 8+默认启用Java 17+,检查
sourceCompatibility和targetCompatibility是否设为17或更高 - 如果用
api替代implementation,下游模块能直接用Guava类型,但会增加耦合,慎用 - 报
package com.google.common.base is not visible?八成是模块限制,先关模块系统验证
ClassCastException出现在ImmutableList.asList()之后
这不是Guava的bug,是你误把 ImmutableList 当普通 List 修改了。它的 asList() 返回的是不可变视图,底层仍指向原对象;一旦你拿这个结果去传给期望可变List的方法(比如 Collections.sort()),运行时就崩。
Guava所有 ImmutableXXX 类型都禁止修改,连 clear()、add() 都会抛 UnsupportedOperationException,但有些框架(比如老版本MyBatis)内部会偷偷调 list.remove(0),这就踩雷了。
- 要可变副本?用
new ArrayList(immutableList),别信asList()的名字 - 用
Lists.newArrayList()替代Arrays.asList(),前者返回的就是可变List - 单元测试里别只测“能创建”,得测“改了会不会炸”,尤其涉及第三方库回调时
为什么StringSplitter.splitToList()比String.split()慢一倍
因为 StringSplitter 默认做空字符串过滤、trim、跳过null,还建了完整 ImmutableList 实例;而 String.split() 就是纯切分,返回普通String[]。
如果你只是拆IP地址或固定格式日志(如 "a|b|c"),根本不需要Guava这套逻辑,硬上反而拖慢吞吐量。压测过就知道:单次调用差几纳秒,QPS上万时就是几十毫秒延迟。
- 真要用
StringSplitter,关掉冗余行为:StringSplitter.on('|').omitEmptyStrings().trimResults() - 高频路径(如HTTP header解析)建议缓存
StringSplitter实例,别每次new - 注意
splitToList()返回的是不可变集合,反复调用get(0)没问题,但想remove()就得转成ArrayList
Guava不是银弹,它解决的是“写得少、读得多、类型安全”的场景;一旦涉及性能敏感或需要深度控制生命周期的地方,老老实实用JDK原生API更稳。最常被忽略的一点:升级Guava前,务必 grep 全局搜 com.google.common.,看看有没有人偷偷继承了它的抽象类——那些类从不承诺二进制兼容。










