最基础方式是new集合后手动add,兼容性强但冗长;arrays.aslist()返回不可变集合,需套new arraylist()才可变;java 9+推荐list.of()等不可变工厂方法;第三方库如guava可补足标准库限制。

直接用 new 创建并手动添加元素
这是最基础、兼容性最强的方式,适用于所有 Java 版本,尤其适合初始化时元素数量少且固定。
- 必须显式调用
add()或addAll(),不能在构造时传入元素列表 - 对
ArrayList、HashSet等常见集合都适用,但注意Arrays.asList()返回的是不可变集合,不能直接用于new ArrayList(Arrays.asList(...))的构造(除非你明确需要它) - 性能无额外开销,但代码略冗长
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
使用 Arrays.asList() 快速包装数组
适合“一次性创建不可变集合”的场景,常被误当作可变集合使用,导致 UnsupportedOperationException。
-
Arrays.asList("a", "b", "c")返回的是java.util.Arrays$ArrayList,它是List接口的实现,但不支持add()、remove()、clear() - 若需可变副本,应再套一层:
new ArrayList(Arrays.asList("a", "b", "c")) - 注意泛型推断:
Arrays.asList(1, 2, 3)中的1是int,会被装箱为Integer;但Arrays.asList(new int[]{1,2,3})会返回List<int></int>,不是你想要的
List<String> fixedList = Arrays.asList("x", "y", "z"); // 不可变
List<String> mutableList = new ArrayList<>(Arrays.asList("x", "y", "z")); // 可变
Java 9+ 的 List.of()、Set.of()、Map.of()
语法简洁、线程安全、不可变,是现代 Java 初始化小集合的首选方式,但有严格限制。
- 元素数量上限:
List.of()和Set.of()最多 10 个参数;超过需用ofEntries()或集合工厂方法 - 不允许
null:传入null会抛NullPointerException - 重复元素:对
Set.of()会抛IllegalArgumentException;Map.of()键重复也会报错 - 返回实例是高度优化的紧凑实现(如
ImmutableCollections.List12),内存占用小
List<String> list = List.of("a", "b", "c");
Set<Integer> set = Set.of(1, 2, 3);
Map<String, Integer> map = Map.of("one", 1, "two", 2);
使用静态工厂方法或工具类(如 Guava、Apache Commons)
当标准库无法满足需求(比如需要不可变但允许 null、需预设容量、需从流构建等),第三方库能补足缺口。
立即学习“Java免费学习笔记(深入)”;
- Guava 的
ImmutableList.of()允许null(需显式声明类型),Lists.newArrayList()支持 varargs 且返回可变列表 - Apache Commons Collections 的
CollectionUtils.addAll()可简化批量添加逻辑 - 注意依赖引入成本:若项目已用 Guava,优先复用其工厂;若只是简单初始化,不必为一行代码加一个依赖
- Java 16+ 的
Stream.toList()(返回不可变)也可用于动态生成场景,但不是“初始化”,而是构建过程
// Guava 示例(需引入 com.google.guava:guava)
List<String> guavaList = Lists.newArrayList("a", "b", "c");
ImmutableList<String> immuList = ImmutableList.of("x", null); // 允许 null
不可变集合的“不可变”是强契约:不是靠文档约定,而是运行时强制抛异常。哪怕只漏看一个 of() 和 ofEntries() 的区别,或者误把 Arrays.asList() 当作可变容器,都会在运行时崩。初始化方式选错,往往不是功能出错,而是后期扩容、修改、并发访问时突然翻车。










