collections.singletonlist 是最轻量安全的单元素不可变集合构造方式,仅持一个引用、无额外对象分配、天然不可变;适用于只读参数传递、临时响应封装及 stream 空值补全等场景。

当你只需要一个不可变的单元素集合时,Collections.singletonList 是比手动新建 ArrayList 或数组再转集合更轻量、更安全的选择。
为什么不用 new ArrayList(Arrays.asList(x))?
这种写法看似直观,但存在三重开销:创建数组、创建 Arrays.asList 返回的固定大小列表、再包装成 ArrayList。而 singletonList 内部仅持有一个引用,无额外对象分配,且返回的集合天然不可变(调用 add、clear 等会直接抛 UnsupportedOperationException)。
适用场景明确,避免误用
它适合以下典型情况:
- 作为方法参数传入,该方法只读取集合内容(如
stream().findFirst()后需包装为集合继续处理) - 构建临时响应结构,例如 REST 接口返回单条记录封装为
List<user></user> - 在 Stream 操作中补全空值逻辑,如
Optional.ofNullable(user).map(Collections::singletonList).orElse(Collections.emptyList())
注意不可变性与类型擦除细节
singletonList 返回的是 List<t></t>,类型安全;但它不是泛型类实例,而是静态工厂方法,因此不会因类型擦除导致运行时异常。不过要避免把它当作可变集合使用——没有“先创建再添加”的余地,也不支持 null 元素(除非元素本身允许为 null,它本身是允许的)。
对比其他单元素构造方式
相比 Arrays.asList(x):后者返回的是固定大小列表,虽也轻量,但允许修改(如 set(0, y)),语义上不如 singletonList 明确表达“只读单例”意图;相比 List.of(x)(Java 9+):两者都不可变且高效,但 List.of 支持多元素且对 null 更严格(不允许),而 singletonList 兼容所有 Java 版本,且明确限定为单元素语义。










