Lists.newArrayList()适合初始化但禁在循环中频繁调用;Iterables.filter()是延迟视图且不支持并行;CollectionUtils.isEmpty()仅适用于Collection;ImmutableList.of()不可变且序列化更优但不容null。

用 Lists.newArrayList() 替代 new ArrayList(),但别在循环里反复调用
Guava 的 Lists.newArrayList() 写起来快、可变长、支持泛型推断,比原生构造函数少写一堆尖括号。但它本质还是新建对象,不是“零开销”语法糖。
- 适合初始化:比如
Lists.newArrayList("a", "b", "c"),清晰又安全 - 避免在高频循环中使用:比如日志聚合或流式处理里每轮都
Lists.newArrayList(item),会触发频繁 GC - 注意返回的是
ArrayList实例,不是不可变集合——如果后续要防误改,得套一层ImmutableList.copyOf()
Iterables.filter() 和 Streams.filter() 别混用,前者不支持并行且不触发计算
Guava 的 Iterables.filter() 返回的是延迟计算的视图(FilterIterable),不真正执行过滤,直到你遍历或转成 List;而 Java 8+ 的 Stream.filter() 是懒加载但必须显式终止(如 collect())才会跑逻辑。
- 用
Iterables.filter()时,如果只传入一个空集合或 null,它不会报错,但后续遍历时才暴露 NPE —— 容易漏测 - 它不支持 lambda 表达式直接传参,得包装成
Predicate,比如Iterables.filter(list, Predicates.notNull()) - 如果集合很大又需要并发处理,别用它——没
parallelStream()那套机制,强行多线程遍历视图反而可能出竞态
Apache Commons Collections 的 CollectionUtils.isEmpty() 真香,但别拿来判字符串
这个工具方法能同时处理 null 和空集合,比手写 coll == null || coll.isEmpty() 少出错。但它只认 Collection 及其子类,对 String 或数组完全无效。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 常见误用:把
String s = null;传给CollectionUtils.isEmpty(s)→ 编译不过,因为类型不匹配 - 它内部是
collection == null || collection.isEmpty(),没有额外开销,可放心用于 DAO 层返回值校验 - 注意和
ObjectUtils.isEmpty()区分:后者才支持 String、Map、Array 等多种类型,但语义更宽泛(比如对 String 会判 null 或 "")
Guava 的 ImmutableList.of() 不只是“不可变”,还影响序列化和 equals 行为
用 ImmutableList.of("a", "b") 创建的实例,不仅不能 add/remove,它的 equals() 和 hashCode() 实现也和 ArrayList 不同——底层用了更紧凑的结构,相同元素顺序下必然相等,且序列化后体积更小。
立即学习“Java免费学习笔记(深入)”;
- 跨服务传参时,如果用
ArrayList当 DTO 字段,下游修改可能破坏上游状态;换成ImmutableList能堵住这类隐式副作用 - 但它不接受 null 元素:
ImmutableList.of("a", null)会抛NullPointerException,不是运行时才崩,是构造时就崩 - 如果集合大小不确定,别硬凑
of();超过 5 个参数会自动降级到copyOf(),性能无损,但代码可读性下降
Maps.filterKeys() 返回的视图仍持有原始 Map 引用,原始 Map 改了,视图结果也会变;这种“活引用”关系不画图、不加注释,过两个月自己都看不懂。

















