Collections.emptySet() 最省空间,因其复用全局静态不可变单例对象,不创建新实例、不分配内存;而 new HashSet() 和 Set.of() 每次调用均新建对象。

直接返回 Collections.emptySet() 是最省空间的方式,因为它复用一个全局静态的、不可变的空 Set 实例,完全避免重复创建对象。
为什么 emptySet() 不创建新对象?
Collections.emptySet() 内部返回的是一个私有静态单例对象(JDK 中是 EmptySet 类的唯一实例),无论调用多少次,都指向同一块堆内存地址。它不依赖泛型类型参数生成新类,也不分配新数组或哈希表结构。
对比其他“返回空集合”的写法
- ❌ new HashSet():每次调用都新建对象,分配底层 HashMap 结构(至少包含 table 数组、size、modCount 等字段);
-
❌ Set.of()(Java 9+):虽为不可变,但每次调用仍会新建一个
ImmutableSet实例(哪怕元素为空); - ✅ Collections.emptySet():零对象创建,零字段初始化,仅一次静态引用返回。
使用时的关键注意事项
确保方法签名返回的是 Set 或其父接口(如 Collection),且调用方不尝试修改该集合(否则会抛 UnsupportedOperationException)。若需泛型安全,可配合类型推断:
public Set<String> getTags() {
return Collections.emptySet(); // 编译器自动推断为 Set<String>
}
无需显式类型转换或 emptySet<string>()</string>(该方法不存在),泛型擦除后仍能保证类型安全。
扩展:统一空集合策略
同理,对其他集合类型也优先选用对应静态空实例:
-
Collections.emptyList()替代new ArrayList() -
Collections.emptyMap()替代new HashMap() - 避免
Collections.singleton(null)等非空但无意义的“伪空”构造
所有这些静态空实例共享同一设计原则:不可变 + 单例 + 零状态。

















