Collections.emptyList() 返回全局共享的空不可变列表,内存开销为零,因直接返回静态 final 的 EmptyList 单例对象,不创建新实例;适用于初始化、返回空集合等场景,支持只读操作,不可修改。

Collections.emptyList() 返回的是一个全局共享的、类型安全的空不可变列表,它不分配任何新对象,内存开销为零 —— 因为 JVM 中只有一个 EMPTY_LIST 实例(静态 final),所有调用都返回同一个引用。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
为什么是零内存开销?
该方法内部直接返回一个私有静态单例对象:
// JDK 源码简化示意private static final List EMPTY_LIST = new EmptyList();
每次调用 Collections.emptyList() 都只是返回这个早已存在的对象,不会 new 任何新实例,也不依赖泛型擦除后的类型参数创建额外结构。
如何正确使用它
- 直接赋值给泛型变量,编译器自动推断类型:
List<string> list = Collections.emptyList();</string> - 适合用于初始化字段、返回空集合、避免 null 或 new ArrayList() 的冗余分配
- 不能添加、删除、清空或修改 —— 调用这些操作会抛
UnsupportedOperationException - 支持
size() == 0、isEmpty() == true、contains(x) == false等只读行为
和其它“空列表”方式的区别
-
new ArrayList():分配新对象,至少占用 ~12 字节(对象头)+ 数组引用 + 初始容量数组(通常 10 个元素空间) -
Arrays.asList()返回的空数组列表:需传入空数组Arrays.asList(new String[0]),仍会新建数组对象 -
Collections.emptyList():无对象创建、无数组分配、无状态 —— 真正零开销
注意事项
- 它是
Serializable,可序列化(反序列化后仍是等价的空列表) - 泛型安全:虽然底层是
EmptyList<object></object>,但通过泛型桥接方法保证类型擦除后仍能适配任意List<t></t> - 不要试图转型成
ArrayList或其他实现类 —— 它是私有静态内部类,无法强转

















