用 isempty() 判断集合是否为空最安全,但需先确保集合非 null;推荐 objects.nonnull(list) && !list.isempty(),避免 npe;size() == 0 语义不清且可能触发懒加载。

用 isEmpty() 判断集合是否为空最安全
Java 集合类(ArrayList、HashMap、HashSet 等)都继承自 Collection 或实现 Map 接口,它们各自提供了标准的空值检查方法:isEmpty()。这个方法语义明确、性能好,且不会因集合为 null 而抛异常——前提是**你已经确保集合对象不为 null**。
常见错误是直接调用 list.isEmpty() 却没做 null 检查,一旦 list == null,就会触发 NullPointerException。
- ✅ 正确写法(先判空再调用):
if (list != null && !list.isEmpty()) { ... } - ✅ 更简洁(用
Objects.nonNull()):if (Objects.nonNull(list) && !list.isEmpty()) { ... } - ❌ 错误写法:
if (list.isEmpty()) { ... } // list 为 null 时直接崩
为什么不用 size() == 0?
size() 和 isEmpty() 在绝大多数 JDK 实现中性能几乎无差别(例如 ArrayList 的 isEmpty() 就是 size() == 0),但语义上 isEmpty() 更清晰、意图更直接。更重要的是:部分集合(如某些懒加载或代理集合)可能重写了 isEmpty() 做短路优化,而 size() 可能触发实际计算或遍历。
- 对
LinkedList、ArrayList、HashMap来说,两者等价,可互换 - 对 Guava 的
ImmutableList或某些 ORM 返回的懒集合(如 Hibernate 的PersistentBag),isEmpty()可能不加载数据,size()却会强制初始化 - 永远别写
list.size() > 0替代非空判断——多一次整数比较,且可读性差
Map 类型要用 isEmpty(),不是 keySet().isEmpty()
Map 接口也定义了 isEmpty() 方法,它直接检查内部条目数,比先取 keySet() 再判空高效且安全。尤其当 map 是 null 或是空 ConcurrentHashMap 时,keySet() 可能返回不可变视图或触发额外逻辑。
立即学习“Java免费学习笔记(深入)”;
- ✅ 推荐:
if (map != null && !map.isEmpty()) { ... } - ❌ 不必要且低效:
if (map != null && map.keySet() != null && !map.keySet().isEmpty()) { ... } - 注意:
map.keySet()永远不会返回null(JDK 规范保证),所以上面的map.keySet() != null是冗余的
工具类能简化,但别盲目依赖
Apache Commons Collections 的 CollectionUtils.isEmpty() 和 Guava 的 Iterables.isEmpty() 确实能自动处理 null,比如 CollectionUtils.isEmpty(list) 对 null 返回 true。但要注意:它们的“空”语义可能和业务需求冲突——比如你希望 null 视为非法输入并显式报错,而不是静默当作空集合处理。
- 用
CollectionUtils.isEmpty()前确认团队规范允许隐式null容忍 -
Iterables.isEmpty(null)返回true,但Iterables.isEmpty(ImmutableList.of())也返回true,二者无法区分 - 如果项目没引入这些库,硬加一个只为省两行判空,得不偿失
null 场景、匹配真实业务语义,以及在性能敏感路径避开意外加载。别让“一行代码”掩盖了对数据生命周期的理解。










