Java 9 的 List.of()、Set.of()、Map.of() 创建轻量级不可变集合,元素不可为 null,修改操作抛 UnsupportedOperationException,Map.of() 最多支持 10 对键值。

Java 9 引入了 `List.of()`、`Set.of()` 和 `Map.of()` 等静态工厂方法,用于快速创建**不可变集合**。这些方法返回的集合是轻量级、线程安全、不允许修改(如 add/remove/put)的实现。
核心特点
通过 `of` 创建的集合具有以下关键特性:
- 元素不能为空(传入 null 会直接抛出 NullPointerException)
- 集合本身不可变:调用 add、remove、clear 等修改方法会抛出 UnsupportedOperationException
- 底层实现高度优化,内存占用小,适合常量或配置类数据
- 对于 Map.of(),键必须唯一;重复键会抛出 IllegalArgumentException
基本用法示例
按类型分别创建:
-
List:
List<String> list = List.of("a", "b", "c"); -
Set:
Set<Integer> set = Set.of(1, 2, 3); -
Map(键值对成对):
Map<String, Integer> map = Map.of("one", 1, "two", 2);
注意:`Map.of()` 最多支持 10 个键值对(即 20 个参数)。超过需用 Map.ofEntries(Map.entry(k1,v1), ...)。
立即学习“Java免费学习笔记(深入)”;
处理空值与异常
显式传入 null 会立即失败:
-
List.of("a", null)→ 抛出 NullPointerException -
Set.of(1, null)→ 同样抛出 NullPointerException -
Map.of("k", null)→ 键或值为null均触发 NullPointerException
若需容纳 null,不能使用 `of` 方法,应改用传统方式(如 new ArrayList())并手动包装为不可变视图(如 Collections.unmodifiableList()),但后者不检查运行时修改,也不如 `of` 高效。
与旧方式对比
相比 Java 8 及之前常用的 Collections.unmodifiableXXX():
- `of` 返回的是全新不可变实现,不是对可变集合的“只读包装”,因此更安全(原始集合无法被意外修改影响它)
- `of` 集合在序列化、哈希计算等方面做了专门优化
- `Collections.unmodifiableList(new ArrayList(...))` 仍存在底层列表被篡改的风险(如果保留了原始引用)


















