Guava不可变集合无public结构器必须通过静态工厂创建如Immutablelistt等.of()或copyof()修改操作抛unsupportedoperationexceptionMultimap简化嵌套列表管理Stream直接collecttttam(ImmutableList.toImmutableList())JDK21Imutablelist没有实现 SequencedCollection。ImmutableList、ImmutableSet 为什么不能直接 newGuava 不可变集合不依赖 final 装饰的普通集合而是全新结构的只读实现。你写的new ImmutableList()会编译失败-它没有 public 构造器。正确的入口只有静态工厂方法核心是「构建即冻结」逻辑:一旦生成任何修改操作(如add()、remove()都会抛UnsupportedOperationException。用ImmutableList.of(a, b)最多创建小固定集合(创建小固定集合( 5 个元素超过 5 个或需要从现有集合转换使用ImmutableList.copyOf(list)注意传入 null 会直接 NPE建议先判空ImmutableSet.copyOf(collection)自动去除重复元素但不保证顺序(底层使用)ImmutableHashSet要有序用ImmutableSortedSetMultimap 代替 Map 的真实代价写Mapstring list/string手动管理嵌套列表非常麻烦每次 put 前得检查 key 是否存在、list 是空的是否想要 new ArrayList。而Multimap包装这件事但代价是它不继承Map接口不能直接做 Map 用。常用的是ArrayListMultimap.create()(值按插入顺序)和HashMultimap.create()(值无序内存更省)put(k1, 1)和put(k1, 2)后get(k1)返回是不可修改的Collection视图不能调整clear()或remove()—— 想删除一个值得使用的remove(k1, 1)若需要支持 null key 或 null value必须选LinkedHashMultimap或显式 wrap因为默认禁止 nullImmutableList.copyOf() 流式处理中容易误踩坑很多人在 Stream 后接collect(Collectors.toList())再传给ImmutableList.copyOf()认为双重保险。事实上没有必要再经历一次。Stream 本身有toList()Java 16)返回是不可变的 List但它是 JDK 实现和 Guava 无关Guava 的ImmutableList.toImmutableList()是配套收集器错误写法stream.collect(Collectors.toList()).stream().collect(ImmutableList.toImmutableList())—— 白跑两轮正确写法stream.collect(ImmutableList.toImmutableList())而且收集器内部做了短路优化遇到了 null 元素会立即报告NullPointerException直到遍历才崩溃而不是延迟如果 stream 可能为空toImmutableList()回来的是空的ImmutableList不是 null这点比自己 new ArrayList 安全Guava 集合和 JDK 21 SequencedCollection 的关系Java 21 引入了SequencedCollection让LinkedList、ArrayDeque支持统一getFirst()/getLast()。但它和 Guava 不可变集合没有交集——Guava 的ImmutableList这个接口没有实现JDK 也没有让它实现的计划。这意味着你不能正确ImmutableList调用getFirst()即使内部是数组实现如果你想拿起头尾你只能用它get(0)和get(size() - 1)并自己判空如果你的代码同时依赖于它 JDK 新 API 和 Guava例如不要假设行为兼容SequencedCollection.reversed()返回的是新视图而ImmutableList.reverse()这是一个真正的反序副本内存费用不同现在最稳定的混合方式把手 Guava 集合作为数据源转化为 JDK 接口如list.stream()再进新 API 流程不可变性和多值映射的边界非常清晰但具体到每个工厂的方法 null 处理、空集合返回值和和 JDK 新特性的错位是写代码时真正卡住人的地方。