collections.singletonlist()用于创建轻量、线程安全、不可变的单元素list,仅持一个引用字段,内存开销极小,支持get(0)等只读操作,但add/remove/set均抛unsupportedoperationexception。

Collections.singletonList() 是 Java 提供的一个静态工厂方法,用于快速创建一个**不可变的、只含一个元素的 List**。它返回的是内部实现的私有静态类(如 SingletonList),不是 ArrayList 或 LinkedList,因此具备轻量、安全、高效的特点。
为什么用 singletonList() 而不是 new ArrayList(Collections.singleton(...))?
它比手动构造更简洁,且避免了不必要的对象开销:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 不分配额外数组或扩容逻辑,内存占用极小
- 天然线程安全(因不可变,无需同步)
- 明确表达“就一个元素”的语义,代码可读性高
- 不会意外被修改(调用
add、remove、set等会直接抛UnsupportedOperationException)
基本用法:传入任意非 null 元素即可
注意:参数可以是 null,但返回的列表仍不可变 —— 允许包含 null 值本身是合法的:
List<string> oneName = Collections.singletonList("Alice");
List<integer> oneNumber = Collections.singletonList(42);
List<string> nullItem = Collections.singletonList(null); // 合法</string></integer></string>
典型使用场景
-
作为方法参数临时传入:比如某 API 接收
List<t></t>,但你只有一个值,不想新建ArrayList - 构建不可变配置项:如默认选项、单例策略列表
-
与 Stream 或函数式 API 配合:例如
Stream.of(...).flatMap(x -> singletonList(x).stream())(虽不常见,但语义清晰) -
替代 Arrays.asList(T) 的简化写法:两者效果类似,但
singletonList更强调“唯一性”和“不可变性”
注意事项
- 返回的 List 不支持任何结构性修改操作(
add、remove、clear、retainAll等都会抛异常) - 允许
get(0)、size()、contains()、indexOf()等只读操作 - 不是
Serializable的子类型(但实际在 JDK 9+ 中已实现序列化,兼容性通常无问题) - 若需可变列表,仍应使用
new ArrayList(Collections.singleton(...))或直接Arrays.asList(...)(注意后者也不可扩容)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










