collections.singleton()用于创建含单个元素的不可变set,调用add、remove、clear等修改操作均抛unsupportedoperationexception,适用于配置项、默认值等只读场景,支持null元素,而java 9+推荐使用set.of()。

Collections.singleton() 是 Java 提供的便捷工具方法,用于快速创建只含一个元素、且不可变的 Set。它返回的是一个内部实现的私有静态类实例(如 SingletonSet),底层不支持添加、删除、清空等修改操作,调用会直接抛出 UnsupportedOperationException。
基本用法:传入单个元素即可
方法签名是 public static <t> Set<t> singleton(T o)</t></t>,泛型确保类型安全。只需传入一个非 null 元素(注意:null 也是合法元素,但需确保业务允许):
Set<string> singleSet = Collections.singleton("apple");</string>
此时 singleSet 是一个只含 "apple" 的不可变 Set,大小恒为 1。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
不可变性体现在哪些操作上?
尝试任何修改都会失败,例如:
-
singleSet.add("banana")→ 抛出UnsupportedOperationException -
singleSet.remove("apple")→ 同样抛异常 -
singleSet.clear()→ 不允许清空 -
singleSet.iterator().remove()→ 迭代器也不支持 remove
适用场景和注意事项
适合用在配置项、默认值、枚举子集或 API 返回中,强调“只读语义”:
- 作为方法返回值,避免调用方意外修改内部集合
- 初始化常量 Set,比如
public static final Set<string> DEFAULT_ROLES = Collections.singleton("USER");</string> - 与 Stream 或 Collections 工具方法配合,如
Stream.concat(Stream.of("a"), Collections.singleton("b").stream()) - 注意:它不是线程安全的“安全发布”替代品,但因不可变,天然适合多线程读取
和其它不可变集合方式对比
Java 9+ 推荐优先使用 Set.of("element")(支持空集、多元素、更统一的不可变集合 API),但 Collections.singleton() 仍广泛存在于旧代码中,且兼容 Java 5+。两者都不可变,但 Set.of() 在元素为 null 时会抛 NullPointerException,而 singleton(null) 是允许的。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










