前天 09:18

Collections.singletonList()用法

王姐姐

Java后端

(12)

(0)

收藏

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 也是不可变的

四、类似方法对比

方法

可变性

元素数量

用途

Collections.singletonList(o)

不可变

1

单元素不可变列表

Arrays.asList(o)

部分可变(set 可以,add/remove 不行)

任意

快速转数组为 List

List.of(o)

(Java 9+)

不可变

任意

更现代的不可变列表

new ArrayList<>(...)

可变

任意

需要修改的场景

总结

当你需要一个只包含一个元素、不可变、线程安全且高效的 List 时,就用 Collections.singletonList()

尤其在调用第三方 API(如 Redis、MyBatis、Stream 操作等)要求 List 参数但你只有一个值时,它是最佳选择。




0条评论

点击登录参与评论