Collections.singletonList(T o) 是 Java 标准库 java.util.Collections 中的一个静态工厂方法,用于创建一个只包含单个元素的不可变(immutable)List。
一、方法签名
public static <T> List<T> singletonList(T o)
参数:任意对象
o返回值:一个大小为 1、内容不可变的
List<T>,其中唯一元素就是o
二、典型使用场景
1. 需要传递一个只含一个元素的 List,但又不想手动 new ArrayList
当你调用某个方法,该方法参数要求是 List<T>,而你只有一个元素时,用它比写 new ArrayList<>(Arrays.asList(x)) 更简洁高效。
✅ 示例:
void sendEmails(List<String> emailList) { ... }
// 调用
sendEmails(Collections.singletonList("user@example.com"));2. 配合 Redis、数据库等 API 使用(如你之前提到的 RedisScript)
很多框架 API 要求传入 List 类型的 keys 或参数,即使只有一个 key。
✅ 示例(Spring Data Redis):
stringRedisTemplate.execute(
redisScript,
Collections.singletonList("myLock"), // KEYS[1]
"requestId" // ARGV[1]
);这里 Redis Lua 脚本的 KEYS 必须是 List,哪怕只有一个 key。
3. 返回一个安全的、不可变的单元素列表(避免被修改)
singletonList 返回的 List 是不可变的:不能添加、删除或修改元素。这在需要防御性编程时很有用。
✅ 安全返回示例:
public List<String> getAdminUsers() {
return Collections.singletonList("admin"); // 外部无法修改这个列表
}对比:
// ❌ 危险:调用者可能修改返回的 list
private static final List<String> admins = new ArrayList<>(Arrays.asList("admin"));
public List<String> getAdminUsers() {
return admins; // 调用者可以 add/remove!
}4. 性能和内存优化
singletonList 内部实现非常轻量(通常是一个内部静态类),只存储一个引用,不涉及数组扩容等开销,比 new ArrayList<>() 更节省内存和初始化时间。
三、注意事项
不能修改:调用
add()、remove()等方法会抛出UnsupportedOperationException线程安全:因为不可变,所以天然线程安全
如果你需要一个可变的单元素列表,应该用:
new ArrayList<>(Collections.singletonList(item))
或 Java 9+:
new ArrayList<>(List.of(item)) // List.of 也是不可变的
四、类似方法对比
方法 | 可变性 | 元素数量 | 用途 |
| 不可变 | 1 | 单元素不可变列表 |
| 部分可变(set 可以,add/remove 不行) | 任意 | 快速转数组为 List |
(Java 9+) | 不可变 | 任意 | 更现代的不可变列表 |
| 可变 | 任意 | 需要修改的场景 |
总结
当你需要一个只包含一个元素、不可变、线程安全且高效的 List 时,就用 Collections.singletonList()。
尤其在调用第三方 API(如 Redis、MyBatis、Stream 操作等)要求 List 参数但你只有一个值时,它是最佳选择。

0条评论
点击登录参与评论