collections.ncopies 返回不可变列表,含 n 个相同元素;支持 null 和引用类型,但后者共享同一对象实例;需可变时须包装为 arraylist 或用 stream 生成独立对象。

Collections.nCopies 是 Java 提供的一个便捷工具方法,用于快速创建一个**不可变的、包含 n 个相同元素的列表**。它返回的是 List<t></t>,但底层是优化过的只读实现,不支持添加、删除或修改操作。
基本用法:创建固定重复值的列表
语法很简单:
Collections.nCopies(n, element)其中 n 是元素个数(必须 ≥ 0),element 是要重复的对象(可为 null)。
例如,创建包含 5 个 "hello" 的列表:
List此时 list 是 [hello, hello, hello, hello, hello],但它是只读的 —— 调用 add()、set()、remove() 等会直接抛出 UnsupportedOperationException。
需要可变列表?请包装成 ArrayList
如果后续要修改内容(比如 add、set),必须将结果复制到可变集合中:
- 用
new ArrayList(Collections.nCopies(...)) - 或用
ArrayList.copyOf(Collections.nCopies(...))(Java 10+)
示例:
Listmutable.set(1, 99); // ✅ 成功:[42, 99, 42]
注意引用类型共享问题
如果重复的是**可变对象**(如 new ArrayList() 或自定义类实例),所有位置都指向同一个对象引用:
- > lists = Collections.nCopies(2, new ArrayList());
lists.get(0).add("a");
System.out.println(lists); // [[a], [a]] —— 两个元素其实是同一个 List 实例
解决办法:用循环或 Stream 生成独立对象:
List- > lists = Stream.generate(ArrayList::new)
.limit(2)
.collect(Collectors.toList());
常见适用场景
- 初始化测试数据(如填充 100 个默认值)
- 构造参数列表(如 SQL 批量插入时的占位符)
- 作为不可变默认值(避免意外修改)
- 配合
Collections.fill()做对比(后者作用于已有可变列表)
不复杂但容易忽略细节 —— 记住它返回的是不可变视图,要用可变版本就得显式复制。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











