用 isEmpty() 判空最安全,语义清晰、性能好且不抛异常;null 应被修复而非防御性检查;CollectionUtils.isEmpty() 仅用于必须容忍 null 的场景。

用 isEmpty() 判断集合是否为空最安全
Java 所有标准集合类(ArrayList、HashMap、HashSet 等)都继承自 Collection 或实现 Map 接口,它们都提供了 isEmpty() 方法。这个方法专为判空设计,语义清晰、性能好(通常 O(1)),且不抛异常。
常见错误是先判 null 再调用 size() == 0,但多此一举——只要集合对象非 null,isEmpty() 就能直接用;如果集合可能为 null,那首要问题是修复空值来源,而不是在每处判空加防御性检查。
-
list.isEmpty()比list != null && list.size() == 0更简洁、可读性更高 -
map.isEmpty()同理,不要写map != null && map.size() == 0 - 注意:
isEmpty()对null引用会抛NullPointerException,这不是缺陷,而是提醒你该处理空指针了
别用 size() == 0 替代 isEmpty()
虽然多数集合的 size() 是 O(1),但部分实现(如某些懒加载或包装类)可能触发计算开销;更重要的是,size() == 0 表达意图不如 isEmpty() 明确——它说的是“数量为 0”,而你要表达的是“这个集合当前不含元素”。语义偏差会在代码演进中埋下理解成本。
-
LinkedList的size()是 O(1),但旧版 Apache CommonsLazyList可能不是 - Guava 的
ImmutableList虽然size()快,但用isEmpty()更符合其 API 设计哲学 - IDE(如 IntelliJ)通常会对
size() == 0提示 “Replace with isEmpty()”
CollectionUtils.isEmpty() 适合处理可能为 null 的场景
如果你确实无法避免接收 null 集合(比如从外部 API、遗留代码或反序列化中拿到),Apache Commons Collections 提供的 CollectionUtils.isEmpty(Collection>) 和 MapUtils.isEmpty(Map, ?>) 是安全选择。它们内部做了 null 检查,返回 true 当集合为 null 或空。
立即学习“Java免费学习笔记(深入)”;
- 仅在明确需要容忍
null时使用,不要当作默认习惯 - 注意:Spring 的
CollectionUtils.isEmpty()行为不同——它对null返回false,容易误用 - 示例:
CollectionUtils.isEmpty(myList)→true当myList == null或myList.isEmpty()
Stream 判空要小心:count() == 0 不推荐
对 Stream 不能用 isEmpty()(它没有这个方法),也别用 stream.count() == 0——这会强制遍历整个流,复杂度 O(n),且无法短路。正确做法是用 findFirst().isPresent() 或 anyMatch(x -> true) 的否定形式。
-
!stream.findFirst().isPresent()是短路的,遇到第一个元素就停 -
stream.noneMatch(x -> true)语义更直白,但略拗口 -
stream.count() == 0在大数据流或 I/O 流中可能造成严重性能问题
null 的集合,比处处用 CollectionUtils.isEmpty() 的集合更容易维护。空值本身不是技术问题,而是接口定义或数据流转过程中的信号缺失。









