在Java开发中,创建包含重复元素的集合是常见需求,比如初始化固定数量的相同配置项、生成测试用的重复数据等。Collections类的nCopies方法提供了便捷的解决方案,无需手动编写循环逻辑即可快速生成对应集合。

Collections.nCopies方法基本用法
Collections.nCopies是java.util.Collections类的静态方法,作用是返回一个不可变的列表,其中包含指定数量的某个元素的副本。方法的定义如下:
import java.util.Collections;
import java.util.List;
public class NCopiesDemo {
public static void main(String[] args) {
// 创建包含5个"test"字符串的列表
List<String> repeatList = Collections.nCopies(5, "test");
System.out.println(repeatList);
}
}
上述代码运行后会输出[test, test, test, test, test],可以看到列表确实包含了5个相同的"test"元素。
返回集合的特性
需要特别注意,Collections.nCopies返回的列表是不可变的,不支持添加、删除、修改元素的操作,尝试修改会抛出UnsupportedOperationException。示例代码如下:
import java.util.Collections;
import java.util.List;
public class NCopiesModifyDemo {
public static void main(String[] args) {
List<String> repeatList = Collections.nCopies(3, "hello");
// 尝试修改元素,会抛出异常
repeatList.set(0, "world");
}
}
另外,该方法返回的列表并不会实际存储多个元素副本,而是内部维护一个元素引用和数量,因此即使创建数量很大的重复集合,也不会占用过多的内存空间。
常见使用场景
1. 初始化固定数量的默认值
当需要初始化一个包含固定数量相同默认值的集合时,使用nCopies可以简化代码。比如初始化一个包含10个0的整型列表:
import java.util.Collections;
import java.util.List;
import java.util.ArrayList;
public class InitDefaultDemo {
public static void main(String[] args) {
// 创建不可变的10个0的列表
List<Integer> defaultList = Collections.nCopies(10, 0);
// 如果需要可变列表,可以包装成ArrayList
List<Integer> mutableList = new ArrayList<>(defaultList);
System.out.println(mutableList);
}
}
2. 生成测试数据
在单元测试或者功能测试时,经常需要生成大量重复的测试数据,使用nCopies可以快速完成:
import java.util.Collections;
import java.util.List;
public class TestDataDemo {
public static void main(String[] args) {
// 生成100个相同的测试用户对象
User testUser = new User("test", 18);
List<User> testUserList = Collections.nCopies(100, testUser);
System.out.println("测试数据数量:" + testUserList.size());
}
}
class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
}
注意事项
- 如果传入的元素是可变对象,那么所有副本引用的是同一个对象,修改该对象会影响列表中所有元素。比如上面的User例子,如果修改testUser的属性,testUserList中的所有元素都会发生变化。
- nCopies的第一个参数数量不能为负数,否则会抛出
IllegalArgumentException。 - 如果需要可变的重复元素集合,需要把nCopies返回的列表作为构造参数传入ArrayList等可变集合的构造方法中。
和其他创建方式的对比
对比手动循环添加元素的方式,nCopies的代码更简洁,性能也更好,因为不需要多次执行添加操作。下面是两种方式的对比:
| 方式 | 代码量 | 可变性 | 内存占用 |
|---|---|---|---|
| 手动循环添加 | 多 | 默认可变 | 存储所有元素副本 |
| Collections.nCopies | 少 | 默认不可变 | 仅存储一个元素引用和数量 |
JavaCollections.nCopies重复元素集合集合生成修改时间:2026-07-04 18:42:21