java 9 的 set.of() 创建不可变、轻量级、线程安全的只读 set,禁止 null 和重复元素,不支持修改操作,底层高度优化且不可篡改。

Java 9 引入了 Set.of() 静态工厂方法,用于快速创建**不可变(immutable)、轻量级、线程安全**的只读 Set 实例。它底层做了高度优化,空集、单元素、多元素分别用不同精简实现,内存占用小,且禁止 null 元素和重复元素。
✅ 使用 Set.of() 创建只读 Set
语法简洁,直接传入元素即可:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
Set<string> fruits = Set.of("apple", "banana", "cherry");
Set<integer> numbers = Set.of(1, 2, 3, 4, 5);
Set<string> empty = Set.of(); // 空集合
</string></integer></string>
注意:
- 元素必须互不相同,否则抛出 IllegalArgumentException;
- 任意元素为 null,会立即抛出 NullPointerException;
- 返回的 Set **不支持 add/remove/clear 等修改操作**,调用会抛 UnsupportedOperationException。
⚠️ 和传统方式(如 Collections.unmodifiableSet)的区别
- Set.of() 是真正不可变:底层无可变状态,无法通过反射或内部引用篡改;
- 更轻量:例如单元素 Set 直接复用一个共享实例,不额外分配数组;
-
不可序列化问题更明确:它实现了
Serializable,但若元素不可序列化,则序列化时才失败(而非构造时); -
不基于已有集合:不能像
Collections.unmodifiableSet(new HashSet(...))那样包装已有集合 ——Set.of()只接受显式元素列表。
? 常见使用场景与建议
-
配置项/常量集合:如允许的协议名、状态码集合,适合用
private static final Set<string> ALLOWED_TYPES = Set.of("HTTP", "HTTPS");</string>; -
方法参数校验:接收一组合法值,直接用
Set.of()构造后检查是否包含:if (!Set.of("START", "STOP", "RESTART").contains(cmd)) throw new IllegalArgumentException();; - 测试中快速准备数据:比 new HashSet(Arrays.asList(...)) 更简洁安全;
-
注意动态集合需求:如果需要后续添加元素,先用
new HashSet(Set.of(...))转为可变副本。
? 常见错误提醒
- 写成
Set.of(null)→ 抛NullPointerException; - 写成
Set.of("a", "a")→ 抛IllegalArgumentException(duplicate element); - 试图修改:
fruits.add("orange")→ 抛UnsupportedOperationException; - 误以为支持泛型通配:不能写
Set.of(1, "abc")(类型推断失败,编译报错)。
不复杂但容易忽略细节 —— 记住它专为“定义即固定”的轻量场景而生,安全、高效、表达力强。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










