在Java开发中,生成包含重复元素的集合是常见需求,Collections类的nCopies方法可以快速实现这个目的,它位于java.util包下,是专门用来创建包含指定数量重复元素的不可变列表的工具方法。

Collections.nCopies方法基本定义
首先来看nCopies方法的源码定义,它的声明如下:
// 该方法接收两个参数,第一个是生成的元素数量,第二个是要重复的元素对象 // 返回一个不可变的List,包含n个重复的obj元素 public static <T> List<T> nCopies(int n, T obj)
方法的两个参数分别是int n表示要生成的元素个数,T obj表示要重复的元素对象,返回的是一个不可修改的List集合。
基础使用示例
下面通过一个简单的示例演示nCopies的基本使用,生成包含3个重复字符串的列表:
import java.util.Collections;
import java.util.List;
public class NCopiesDemo {
public static void main(String[] args) {
// 生成包含3个"test"字符串的列表
List<String> repeatList = Collections.nCopies(3, "test");
// 打印列表内容
System.out.println(repeatList);
// 打印列表长度
System.out.println(repeatList.size());
}
}
运行上述代码,输出结果如下:
[test, test, test] 3
nCopies返回集合的特性
需要特别注意,nCopies方法返回的列表是不可变的,不支持添加、删除、修改元素操作,尝试修改会抛出UnsupportedOperationException异常:
import java.util.Collections;
import java.util.List;
public class NCopiesModifyDemo {
public static void main(String[] args) {
List<String> repeatList = Collections.nCopies(2, "hello");
// 尝试添加元素,会抛出异常
try {
repeatList.add("world");
} catch (UnsupportedOperationException e) {
System.out.println("添加元素失败:" + e.getMessage());
}
// 尝试修改元素,会抛出异常
try {
repeatList.set(0, "new");
} catch (UnsupportedOperationException e) {
System.out.println("修改元素失败:" + e.getMessage());
}
}
}
另外,nCopies返回的列表并不会实际存储n个元素的副本,它只是在每次访问元素时返回传入的obj对象,因此如果obj是可变对象,修改该对象会影响到列表中所有元素:
import java.util.Collections;
import java.util.List;
class User {
private String name;
public User(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public String toString() {
return name;
}
}
public class NCopiesMutableDemo {
public static void main(String[] args) {
User user = new User("初始名称");
List<User> userList = Collections.nCopies(2, user);
// 修改原始对象
user.setName("修改后名称");
// 列表中的元素也会跟着变化
System.out.println(userList);
}
}
上述代码运行后输出为[修改后名称, 修改后名称],这是因为列表中的元素都是同一个user对象的引用。
常见使用场景
1. 初始化固定长度的默认值列表
当需要创建一个固定长度、所有元素都是默认值的列表时,nCopies非常方便:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class InitListDemo {
public static void main(String[] args) {
// 生成10个默认值为0的Integer列表,再转为可变的ArrayList
List<Integer> defaultList = new ArrayList<>(Collections.nCopies(10, 0));
// 后续可以正常修改这个列表
defaultList.set(0, 1);
System.out.println(defaultList);
}
}
2. 批量填充集合元素
在需要批量给集合填充相同元素时,可以结合addAll方法使用:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class FillListDemo {
public static void main(String[] args) {
List<String> targetList = new ArrayList<>();
// 批量添加5个"default"元素到目标列表
targetList.addAll(Collections.nCopies(5, "default"));
System.out.println(targetList);
}
}
与其他生成重复元素方式的对比
| 实现方式 | 优点 | 缺点 |
|---|---|---|
| Collections.nCopies | 代码简洁,无需循环,内存占用低(不可变列表不存储实际副本) | 返回列表不可变,传入可变对象时需要注意引用问题 |
| for循环手动添加 | 可生成可变列表,逻辑灵活 | 代码冗余,需要写循环逻辑 |
| Arrays.fill填充数组后转列表 | 可操作数组,适合数组场景 | 转成列表后可能存在不可变问题,步骤更多 |
使用注意事项
- 传入的n参数不能是负数,否则会抛出
IllegalArgumentException异常 - 如果需要可变的重复元素列表,需要把nCopies的结果作为构造参数传入ArrayList等可变集合
- 如果重复的元素是可变对象,修改对象会影响列表中所有元素,需要根据需求判断是否适合使用这种方式
总结来说,Collections.nCopies是生成重复元素集合的高效工具,只要理解它的不可变特性和引用机制,就能在合适的场景中合理使用,减少冗余代码。
JavaCollections.nCopies重复元素集合List生成修改时间:2026-06-18 01:45:43