collections.emptylist() 返回全局共享的不可变静态单例,零对象创建、零内存分配、线程安全且类型安全,语义上明确表达“空集合”而非“新建可变空容器”。

因为 Collections.emptyList() 返回的是一个全局共享的静态单例对象,不创建新实例、不分配堆内存,而 new ArrayList() 每次调用都会新建对象、初始化内部数组、触发内存分配 —— 两者在开销、安全性和语义上存在本质区别。
复用单例,零对象创建
该方法内部直接返回一个私有静态 final 实例(如 Collections$EmptyList 或 Java 9+ 的 ImmutableCollections.EmptyList),所有调用共享同一引用。没有 new、没有构造函数执行、没有数组初始化,自然也就没有 GC 压力。
线程安全且无同步成本
这个单例是不可变的(immutable),天生线程安全。不需要加锁、volatile 或 synchronized —— 多线程并发调用 emptyList() 完全无竞争,也无需额外同步逻辑。
类型安全与泛型友好
- Java 8+ 在多数上下文中能推断泛型(如
return Collections.emptyList();) - Java 7 或复杂泛型场景需显式指定(如
return Collections.<string>emptyList();</string>) - 相比
new ArrayList(),它避免了原始类型误用或类型擦除引发的ClassCastException
语义明确,规避空指针风险
返回空集合而非 null,调用方可直接调用 size()、isEmpty()、遍历等操作,无需判空;而 new ArrayList() 虽然也可用,但每次新建对象属于“过度分配”——空集合本就不需要状态,更不需要可变性。
它不是为了“替代 new”,而是为“空”这个确定状态提供最轻量、最安全、最符合契约的表达方式。










