Java 9 集合工厂方法:一行代码创建不可变 List/Set/Map
痛点与解决
Java 8 创建不可变集合需“新建可变集合 → 添加元素 → Collections.unmodifiableXxx() 包装”三步,冗长且易错。Java 9 在 List、Set、Map 接口新增静态工厂方法,一行代码完成创建。
核心方法签名
// List & Set:0-10 个参数重载 + 可变参数重载
static List of(E e1, E e2, ...)
static List of(E... elements)
// Map:0-10 对键值对重载 + Map.Entry 可变参数
static Map of(K k1, V v1, K k2, V v2, ...)
static Map ofEntries(Map.Entry extends K,? extends V>... entries)
关键特性
- 不可变:任何修改操作(
add、put、remove、clear)抛出UnsupportedOperationException。 - 空值不允许:元素、键、值均不能为
null,否则编译或运行时报NullPointerException。 - 确定性迭代顺序:
List.of保持参数顺序;Set.of、Map.of顺序为实现细节但实例间稳定。 - 可序列化:实现
Serializable,适合分布式场景。 - 内存高效:内部使用紧凑数据结构,无冗余对象头。
代码对比
Java 8 方式(冗长)
Set set = new HashSet<>();
set.add("A"); set.add("B"); set.add("C");
set = Collections.unmodifiableSet(set);
List list = new ArrayList<>();
list.add("A"); list.add("B"); list.add("C");
list = Collections.unmodifiableList(list);
Map map = new HashMap<>();
map.put("A","Apple"); map.put("B","Boy"); map.put("C","Cat");
map = Collections.unmodifiableMap(map);
Java 9 方式(简洁)
Set set = Set.of("A", "B", "C");
List list = List.of("A", "B", "C");
Map map = Map.of("A","Apple", "B","Boy", "C","Cat");
// 超过 10 对键值对使用 ofEntries
Map map1 = Map.ofEntries(
new AbstractMap.SimpleEntry<>("A","Apple"),
new AbstractMap.SimpleEntry<>("B","Boy"),
new AbstractMap.SimpleEntry<>("C","Cat")
);
输出结果
[A, B, C]
[A, B, C]
{A=Apple, B=Boy, C=Cat}
{A=Apple, B=Boy, C=Cat}
进阶用法
List.copyOf(list)、Set.copyOf(set)、Map.copyOf(map):从现有集合创建不可变副本(Java 10+)。Collectors.toUnmodifiableList/Set/Map():流收集直接产出不可变集合(Java 10+)。- 空集合:
List.of()、Set.of()、Map.of()返回共享空实例,零开销。
何时不适用
- 需要后续修改集合内容 → 使用
new ArrayList<>()等可变实现。 - 元素/键/值可能为
null→ 使用可变集合或Collections.singletonList等旧 API。 - 超大集合初始化(> 1000 元素) → 工厂方法可变参数可能栈溢出,改用流或构建器模式。
java
- 精通 Java 运算符:类型、语法与实战示例
- Java 抽象类与抽象方法完全指南
- 精通 Java 接口:概念、实现与最佳实践
- 精通 Java Try-With-Resources:自动资源管理详解
- Java 注解详解:类型、放置位置与实战示例
- 掌握 Java 自动装箱与拆箱:实战示例与最佳实践
- Java String toLowerCase() 与 toUpperCase():区域感知的大小写转换
- Java 集合框架完全指南:接口、实现、算法与最佳实践
- Java 10 新增 70+ API 与特性详解
- Java 10 垃圾收集器接口与 G1 并行 Full GC
- Java 9 集合工厂方法:一行代码创建不可变 List/Set/Map
- Java 9 接口私有方法:增强封装与代码复用