Java里如何使用Collections.copy复制集合_集合复制方法解析

Collections.copy()需目标列表有足够容量,否则抛异常;正确做法是先初始化等长列表,推荐使用构造器复制更安全简洁。

在Java中,Collections.copy() 方法用于将一个集合中的所有元素复制到另一个集合中。但使用时需要注意一些关键点,否则容易抛出异常或得到不符合预期的结果。

方法定义与参数说明

该方法的定义如下:

public static void copy(List super T> dest, List extends T> src)

参数含义:
  • src:源列表,即要被复制的数据来源
  • dest:目标列表,即将数据复制进去的列表
注意:两个参数都必须是 List 类型,不能用于 Set、Map 等其他集合类型。

使用前提条件

Collections.copy() 对目标列表有严格要求:
  • 目标列表 必须已经初始化并拥有足够的容量 来容纳源列表的所有元素
  • 如果目标列表长度小于源列表,会抛出 IndexOutOfBoundsException
  • 目标列表中的原有元素

    会被覆盖(按索引位置),但不会自动扩容

常见错误示例:

```java List src = Arrays.asList("a", "b", "c"); List dest = new ArrayList(); // 空列表 Collections.copy(dest, src); // 抛出 IndexOutOfBoundsException ```

正确使用方式

为了成功复制,需确保目标列表有足够的空间。推荐做法:
  • 先用源列表大小初始化目标列表
  • 可借助 Collections.nCopies() 填充占位元素

正确示例:

```java List src = Arrays.asList("apple", "banana", "cherry"); List dest = new ArrayList(Arrays.asList(new String[src.size()])); // 初始化等长空列表

Collections.copy(dest, src); System.out.println(dest); // 输出: [apple, banana, cherry]


或者更简洁的方式:
```java
List dest = new ArrayList<>(Collections.nCopies(src.size(), null));
Collections.copy(dest, src);
```

与其它复制方式的对比

除了 Collections.copy(),还有几种常见的集合复制方法:
  • new ArrayList<>(src):构造器复制,最简单安全,适用于大多数场景
  • list.addAll(src):添加所有元素,适合已有目标集合的情况
  • Collections.copy():适用于需要精确控制索引位置的特殊场景,使用较繁琐
一般情况下,若只是想复制一个 List,推荐直接使用构造器方式,代码更清晰且不易出错。

基本上就这些。Collections.copy() 虽然功能明确,但使用限制较多,实际开发中并不常用。理解其机制有助于处理特定需求,但日常复制建议优先考虑更简洁的方法。