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

Collections.emptyList() 返回的是一个全局共享的、类型安全的空不可变列表,它不分配任何新对象,内存开销为零 —— 因为 JVM 中只有一个 EMPTY_LIST 实例(静态 final),所有调用都返回同一个引用。
为什么是零内存开销?
该方法内部直接返回一个私有静态单例对象:
// JDK 源码简化示意private static final List EMPTY_LIST = new EmptyList();
每次调用 Collections.emptyList() 都只是返回这个早已存在的对象,不会 new 任何新实例,也不依赖泛型擦除后的类型参数创建额外结构。
如何正确使用它
- 直接赋值给泛型变量,编译器自动推断类型:
Listlist = Collections.emptyList(); - 适合用于初始化字段、返回空集合、避免 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,但通过泛型桥接方法保证类型擦除后仍能适配任意List - 不要试图转型成
ArrayList或其他实现类 —— 它是私有静态内部类,无法强转
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











