java 9 并未提供 collection.of(),仅提供 list.of()、set.of() 和 map.of() 这三组静态工厂方法;它们返回由 jdk 内部优化的不可变实现类(如 immutablecollections.list2),构造时校验 null 和重复元素,适用于小型常量集合。

Java 9 引入的 Collection.of 并不存在 —— 这是个常见误解。Java 中实际提供的是 List.of()、Set.of() 和 Map.of() 这三组静态工厂方法,它们返回不可变集合,底层由专门优化的私有实现类支撑,而非继承自传统可变集合。
为什么没有 Collection.of?
Collection 是接口,不能直接实例化;而静态工厂方法必须返回具体类型。JDK 选择为常用子接口(List、Set、Map)分别提供工厂方法,既明确语义,又便于做针对性优化。试图通过 Collection.of() 创建对象会编译失败。
不可变性的关键表现
这些工厂方法创建的集合具有强不可变性:不仅不允许 add/remove/clear 等修改操作,连 toArray() 返回的数组也是只读视图(内部数组被封装,外部无法篡改),且所有迭代器均为 fail-fast 但不支持 remove。
- 调用
add()、remove()、clear()等方法会立即抛出UnsupportedOperationException - 空集合(如
List.of())返回的是共享的单例对象,节省内存 - 元素允许为
null吗?List.of()允许,Set.of()和Map.of()不允许(构造时即校验并抛出NullPointerException)
底层实现与性能特点
它们不是包装了 Arrays.asList() 或 Collections.unmodifiableXXX(),而是使用轻量级专用类(如 ImmutableCollections.ListN、Set12 等)。这些类:
- 无额外字段,仅持有元素引用数组,内存占用极小
- 重写了
equals()、hashCode()、toString(),行为与对应可变集合一致 - 对小尺寸集合(如 0~12 个元素)做了特化实现,避免泛型擦除开销和对象分配
使用注意事项
这些工厂方法适合初始化已知内容的常量集合,不适合动态构建或后续扩展。
- 若需从流或已有集合转换,应先收集再包装:
list.stream().collect(Collectors.toUnmodifiableList())(Java 16+) - 传入重复元素时:
Set.of("a", "a")抛出IllegalArgumentException;List.of("a", "a")正常允许 - 泛型推断可能失败,必要时显式指定类型:
List.<string>of()</string>
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











