list.isEmpty() 方法判断 List 是否为空;也可检查其
size() == 0,两者效果相同,推荐使用
isEmpty()
Java中判断List是否为空是开发中常见的需求,以下是几种主流方法及其详细解析:
核心方法对比
| 方法 | 适用场景 | 优点 | 注意事项 |
|---|---|---|---|
list.isEmpty() |
基础场景 | 代码简洁直观 | 需确保list已初始化(非null) |
list.size() == 0 |
与isEmpty()等价替代方案 |
语义明确 | 性能略低于直接调用isEmpty() |
CollectionUtils.isEmpty(list) |
使用第三方库(如Apache Commons) | 自动处理null值和空集合 | 需引入额外依赖 |
Stream API (count()==0) |
Java 8+函数式编程 | 链式操作灵活 | 语法稍复杂 |
方法一:使用isEmpty()方法
这是最直接且推荐的方式。List接口继承自Collection,其定义的isEmpty()方法专门用于判断集合是否不含元素。
List<String> fruits = new ArrayList<>();
if (fruits.isEmpty()) {
System.out.println("购物车还是空的哦~");
} else {
System.out.println("已有商品待结算");
}
️ 关键点:若未初始化list(即变量为null),调用此方法会抛出NullPointerException,因此建议先做非空校验或采用下文提到的组合写法。
️ 方法二:通过size()判断元素数量
由于isEmpty()内部实现本质就是检查size() == 0,两者完全等效。
if (myList.size() == 0) { / ... / }
// 等同于:
if (myList.isEmpty()) { / ... / }
此方式在某些老旧框架中更常见,但可读性稍逊于显式的isEmpty()调用。
️ 方法三:结合null检查的安全写法
实际开发中常遇到未初始化的list对象(值为null),此时单独使用前两种方法都会异常,推荐采用防御性编程模式:
if (list != null && !list.isEmpty()) {
// 处理非空逻辑
} else {
// 处理空或null的情况
}
或者利用逻辑短路特性简化表达:
if (list == null || list.isEmpty()) {
// 统一处理空/null状态
}
这种模式能有效避免空指针问题,尤其适合处理外部传入参数不确定的场景。
方法四:借助工具类增强健壮性
当项目允许引入第三方库时,Apache Commons Collection的CollectionUtils提供了更完善的解决方案:
import org.apache.commons.collections4.CollectionUtils;
...
if (CollectionUtils.isEmpty(list)) {
// 同时判断了null和空集合的情况
}
该工具类底层已封装了对null的安全处理,适合在复杂系统中统一管理集合判空逻辑,类似的国产工具如HuTool也提供类似功能(如CollUtil.isNotEmpty())。
方法五:Java 8+ Stream API实现
对于追求函数式风格的开发者,可通过流式处理间接判断:
boolean empty = list == null || list.stream().count() == 0;
虽然功能强大,但这种方式性能开销较大(需遍历整个集合),仅建议在需要同时进行其他流操作时使用。
特殊场景扩展
当需要进一步验证列表内容而不仅是结构上的”空”时(例如所有元素均为空白字符串),则需要自定义逻辑,例如实现一个工具方法:
public static boolean isReallyEmpty(List<String> items) {
return items == null || items.isEmpty() ||
items.stream().allMatch(s -> s == null || s.trim().isEmpty());
}
这种方法常用于表单验证等需要深度检查的业务场景。
FAQs
Q1: 为什么不能直接用list == null来判断?
A: 因为== null只能检测引用是否指向堆内存中的对象地址,无法区分实际包含元素的集合与真正意义的”空集合”,正确的做法是同时检查null空洞两种情况,例如一个经过清空操作后的非null列表仍然应该被视为逻辑上的空集合。
Q2: isEmpty()和size()==0哪个效率更高?
A: 根据Oracle官方文档及源码实现,多数JDK的具体类(如ArrayList、LinkedList)都将isEmpty()优化为直接访问底层数组/链表的长度字段,与手动调用size()的性能差异可以忽略不计,但从代码可读性角度,优先推荐使用语义更明确的
