collections.singletonlist 是 java 中创建线程安全、不可变单元素列表的轻量级方法,仅持一个引用字段,内存开销小,适用于高频复用、api 返回值及常量定义等场景,但不支持任何修改操作。
collections.singletonlist 是 java 提供的轻量级工具方法,用于快速创建只含一个元素、线程安全且不可变的列表。它不新建 arraylist 或其他动态结构,而是返回一个内部静态类(singletonlist),仅持有一个引用字段,内存开销极小(约 12–16 字节),适合高频复用的单元素场景。
替代 new ArrayList(Collections.singleton(x)) 的冗余写法
常见错误是用 Collections.singleton(x)(返回 Set)再转成 ArrayList,既多分配对象又破坏不可变性。正确做法是直接用 singletonList:
- ❌ 浪费内存:
new ArrayList(Arrays.asList("a"))→ 创建 ArrayList + 数组 + List 包装器 - ✅ 零冗余:
Collections.singletonList("a")→ 单个对象,无数组,不可修改
作为方法返回值统一接口契约
当 API 需返回“可能为单条结果的列表”(如查询默认配置、兜底值、枚举首项),用 singletonList 可避免 null 返回或临时集合初始化:
- 返回空列表?用
Collections.emptyList() - 返回单条确定结果?用
Collections.singletonList(user),调用方无需判空或特殊处理 - 示例:
public List<user> findPrimaryUser() { return Collections.singletonList(getDefaultUser()); }</user>
在常量/配置类中定义不可变单例列表
将固定单元素列表声明为 static final,JVM 类加载时初始化一次,后续所有调用共享同一实例:
public static final List<string> DEFAULT_ROLES = Collections.singletonList("USER");</string>- 比
Arrays.asList("USER")更明确语义(后者底层是可变的ArrayList子类) - 比手动 new ArrayList + add 更省内存,且杜绝意外修改风险
注意不可变性边界与典型误用
singletonList 返回的列表支持 get(0)、size()、contains() 等只读操作,但任何修改操作(add、set、clear)都会抛 UnsupportedOperationException:
- ✅ 安全:可用于多线程环境,无需额外同步
- ⚠️ 警惕:若需后续添加元素,必须先转为可变集合(如
new ArrayList(list)),此时已失去轻量优势 - ❌ 错误假设:认为
singletonList(x)和Arrays.asList(x)行为完全一致(后者允许set(0, y))











