isEmpty()仅判断集合元素是否为空,不处理null;安全检查需先判空再调用,或使用Guava的Iterables.isEmpty()、Apache Commons的CollectionUtils.isEmpty()等null安全方法。

isEmpty方法在Java集合中的实际行为
isEmpty() 是 Collection 接口定义的方法,所有标准集合类(ArrayList、HashSet、LinkedList 等)都实现了它。它返回 true 当且仅当集合中不含任何元素——不检查是否为 null,也不关心内部结构是否“懒加载”或“代理化”。
常见误用是把它当成空安全判断:如果集合变量本身是 null,直接调用 list.isEmpty() 会抛出 NullPointerException。
如何安全地检查集合是否为空
必须先判空再调用 isEmpty(),或使用工具类封装逻辑。JDK 自带的 Objects 和第三方库(如 Guava、Apache Commons)提供了更稳妥的方式:
- 手动判空:
if (list != null && !list.isEmpty()) { ... } - JDK 9+ 可用
Objects.requireNonNullElse(list, Collections.emptyList()).isEmpty(),但略重 - Guava 推荐:
Iterables.isEmpty(list)—— 它内部做了null安全处理 - Apache Commons Collections:
CollectionUtils.isEmpty(list)同样容忍null
String、数组、Map 的 isEmpty 不通用
String 有 isEmpty(),但它是 CharSequence 的方法,和集合无关;数组没有 isEmpty() 方法,得用 array.length == 0;Map 虽然也有 isEmpty(),但它判断的是键值对数量,不是“是否为 null”,也不能替代对 keySet() 或 values() 的判空。
立即学习“Java免费学习笔记(深入)”;
特别注意:
Map> map = new HashMap<>(); map.put("k", null); // map.get("k") == null,但 map.get("k").isEmpty() 会 NPE —— 这里要先判 list 是否为 null
Stream 和 Optional 中的“空”语义不同
Stream.empty() 创建的是空流,stream.findFirst() 在空流中返回 Optional.empty(),但这和集合的 isEmpty() 没有直接映射关系。不要试图用 stream.count() == 0 判断集合是否为空——它会强制遍历整个流,性能差且可能触发副作用。
真正需要判断原始集合状态时,始终回到源头:collection != null && collection.isEmpty()。依赖中间转换(比如先转成 Stream 再判断)不仅多此一举,还掩盖了空指针风险。
最易被忽略的一点:某些 ORM 框架(如 Hibernate)返回的集合可能是懒加载代理,isEmpty() 可能触发数据库查询。如果只是想确认“有没有初始化”,不能只靠 isEmpty(),得结合 Hibernate.isInitialized() 或框架特定 API。










