Collections.singleton、singletonList和singletonMap分别创建不可变的单元素Set、List和Map,均不支持修改操作,允许null元素(除Map.of外),内存高效且语义明确“永远只有一项”。

Collections.singleton、singletonList 和 singletonMap 是 Java 标准库中用于创建轻量、不可变单元素容器的三个核心静态方法。它们不分配冗余结构,不支持任何修改操作,语义明确——不是“暂时只有一项”,而是“永远只有一项”。选对方法,关键看你要的是 Set、List 还是 Map。
singletonList:只读单元素 List
返回一个不可变的 List
- 允许 null 元素(
Collections.singletonList(null)合法) - get(0) 安全,get(1) 抛 IndexOutOfBoundsException
- 比
Arrays.asList(x)更严格:后者允许 set(0, y),前者连替换都不允许 - 比
new ArrayList(Collections.singleton(x))节省内存——避免两次对象分配和底层数组开销
singleton:只读单元素 Set
返回一个不可变的 SetCollections$SingletonSet,无实际存储结构,所有行为硬编码实现。
- size() 永远为 1,contains() 仅靠
Objects.equals()判断 - add()、remove()、clear() 全部抛异常,不是“限制”,而是设计契约
- 允许 null(
Collections.singleton(null)有效),而 Java 9+ 的Set.of()明确禁止 null - 序列化支持较弱(因是私有类),生产环境如需持久化建议改用
Set.of()或 Guava
singletonMap:只读单键值对 Map
返回一个不可变的 Map
- put()、remove()、clear() 均抛 UnsupportedOperationException
- key 和 value 都可为 null(取决于泛型约束,如
Map中 key 为 null 会触发 NPE) - 适用于配置透传、默认映射、API 参数包装等场景,比如 Spring SpEL 表达式中常写成
#{T(java.util.Collections).singletonMap('mode', 'prod')} - 与
Map.of(key, value)(Java 9+)语义接近,但后者拒绝 null,且构造更简洁
三者共性:不可变性仅作用于容器结构,不冻结元素本身。若元素是 StringBuilder 或自定义可变对象,仍可通过 get() 取出后修改其状态。真要隔离副作用,得靠设计约定或封装层,而非依赖这些工具方法。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











