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,否则 IndexOutOfBoundsExceptioncopy 实际上是替换
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"); // UnsupportedOperationExceptionnCopies 的内存优化
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 创建不可变重复列表。
