Skip to content

Copy 和 Fill:批量操作集合

copy:复制列表

java
List<String> source = Arrays.asList("a", "b", "c");
List<String> dest = new ArrayList<>(Arrays.asList("x", "y", "z"));
Collections.copy(dest, source);
System.out.println(dest); // [a, b, c]
// 注意:dest 必须 >= source,否则 IndexOutOfBoundsException

copy 实际上是替换

java
// copy 不是追加,是替换对应位置的元素
List<String> dest = new ArrayList<>(Arrays.asList("w", "x", "y", "z"));
List<String> source = Arrays.asList("a", "b", "c");
Collections.copy(dest, source);
System.out.println(dest); // [a, b, c, z]
// source[0] 替换 dest[0],source[1] 替换 dest[1],source[2] 替换 dest[2]
// dest[3] 不受影响

fill:填充列表

java
List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c"));
Collections.fill(list, "X");
System.out.println(list); // [X, X, X]

// 注意:fill 只修改已有元素,不改变列表大小
// 空列表 fill 后仍是空列表

nCopies:创建 n 个重复元素

java
// 创建 5 个 "Hello" 的不可变列表
List<String> repeated = Collections.nCopies(5, "Hello");
System.out.println(repeated); // [Hello, Hello, Hello, Hello, Hello]

// nCopies 返回的是不可变列表!
// repeated.add("more"); // UnsupportedOperationException

nCopies 的内存优化

java
// nCopies 内部只存储一个元素的引用
// 不是创建 10000 个 String 对象,而是存储一个引用重复使用
List<String> list = Collections.nCopies(10000, "item");

nCopies 的常见用途

java
// 预分配大小
List<Object> preAllocated = new ArrayList<>(Collections.nCopies(100, null));

// 初始化一个值
List<Integer> ones = new ArrayList<>(Collections.nCopies(100, 1));

addAll:添加多个元素

java
// Collections.addAll
List<String> list = new ArrayList<>();
Collections.addAll(list, "a", "b", "c");
System.out.println(list); // [a, b, c]
// 比 add() 逐个添加更简洁

其他批量操作

java
List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c", "d"));

// reverse:反转
Collections.reverse(list); // [d, c, b, a]

// shuffle:随机打乱
Collections.shuffle(list);

// swap:交换
Collections.swap(list, 0, 2);

// rotate:旋转
Collections.rotate(list, 1); // 向右旋转 1 位

总结

要点说明
copy复制(替换)列表
fill用一个值填充列表
nCopies创建 n 个重复元素(不可变)
addAll批量添加元素

一句话:copy 替换,fill 填充,nCopies 创建不可变重复列表。

基于 VitePress 构建