推荐用 Collections.emptyList() 是因为它返回线程安全、零内存开销的不可变单例空列表,避免 NullPointerException 和重复创建开销,且具备泛型类型安全;但不可修改,需后续添加元素时应转为可变集合。

Java 中 Collections.emptyList() 返回的是一个不可变的、类型安全的空 List,它比直接返回 null 或新建 new ArrayList() 更安全、更高效。
为什么推荐用 emptyList() 而不是 null 或新实例?
返回 null 容易引发 NullPointerException;每次返回新创建的空集合(如 new ArrayList())会浪费内存和 GC 开销。而 Collections.emptyList() 是单例对象,线程安全,且自带泛型类型擦除保护。
- 它是
final的不可变列表,调用add()、remove()等会直接抛UnsupportedOperationException - 编译期就能检查类型,比如
Collections.只能赋给emptyList() List - 所有调用共享同一个静态实例,零内存开销
如何正确声明和使用泛型类型
必须显式指定泛型参数(或借助方法推断),否则可能触发「未检查转换」警告。推荐写法:
-
List✅(JDK 7+ 支持类型推断)list = Collections.emptyList(); -
List✅(显式指定,兼容老版本)list = Collections. emptyList(); -
List list = Collections.emptyList();❌(原始类型,失去类型安全)
常见适用场景
主要用在「可能无数据但绝不返回 null」的 API 设计中:
- DAO 层查询结果为空时:直接 return
Collections.emptyList() - 工具方法默认返回值:比如
parseTags(String s)没解析出标签就返回空列表 - Optional 链式调用后兜底:如
optional.map(...).orElse(Collections.emptyList())
注意:它不适用于需要后续修改的场景
如果业务逻辑后续要往集合里 add 元素,不能直接用 emptyList(),否则运行时报错。此时应:
- 改用
new ArrayList()(可变) - 或先用
emptyList(),需要修改时再转成可变副本:new ArrayList(Collections.emptyList()) - 也可用
Lists.newArrayList()(Guava)或Stream.empty().collect(Collectors.toList())
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











