Collections.nCopies() 是 Java 中用于创建含 n 个相同元素的不可变只读列表的轻量方法,返回共享引用的内存优化视图,修改可变元素会影响所有位置,适用于默认值初始化或构造可变副本。

Collections.nCopies() 是 Java 集合工具类中一个轻量、不可变的便捷方法,用于快速生成包含 n 个相同元素的列表(List),不实际复制对象引用多次,而是用内存友好的“视图”方式实现。
基本用法:创建固定内容的只读列表
语法很简单:
Collections.nCopies(int n, T element)
它返回一个 List<T>,其中包含 n 个对 element 的引用(注意:是引用,不是深拷贝)。该列表是不可修改的(调用 add、set、remove 等会抛 UnsupportedOperationException)。
例如:
立即学习“Java免费学习笔记(深入)”;
List<String> threeOnes = Collections.nCopies(3, "1"); // 结果:["1", "1", "1"]
常见使用场景与注意事项
-
初始化默认值列表:比如创建长度为 5、全为
null或false的占位列表(适合后续被其他逻辑填充) -
配合
ArrayList构造器创建可变副本:若需要可修改的列表,可将其作为构造参数传入:List<Integer> mutableList = new ArrayList<>(Collections.nCopies(4, 0)); // mutableList 可 add/set/remove -
避免误改共享引用:如果
element是可变对象(如new ArrayList<>()),所有位置都指向同一个实例。修改其中一个,会影响全部 —— 这不是 bug,而是设计使然:List<List<String>> lists = Collections.nCopies(3, new ArrayList<>()); lists.get(0).add("hello"); System.out.println(lists.get(1)); // 输出 [hello] —— 注意!如需独立对象,应手动循环创建或使用 Stream。
和 Arrays.fill()、Stream.generate() 的区别
nCopies() 不分配新数组,也不执行循环;它返回的是内部优化的不可变 RandomAccess 列表,访问快、内存省。相比:
-
Arrays.fill()适用于数组,且要求目标数组已存在 -
Stream.generate(() -> "x").limit(n).collect(Collectors.toList())创建的是可变、但开销更大的新列表
所以,当只需要一个轻量、只读、内容重复的列表时,nCopies() 是最直接的选择。
小技巧:配合 Collections.unmodifiableList 增强语义(虽非必需)
虽然 nCopies() 返回的列表本就不可修改,但显式包装可强化意图、避免 IDE 警告:
List<String> safeList = Collections.unmodifiableList(
Collections.nCopies(10, "default")
);
不过这属于冗余操作,因为底层实现已保证不可变性。


















