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() 虽然功能明确,但使用限制较多,实际开发中并不常用。理解其机制有助于处理特定需求,但日常复制建议优先考虑更简洁的方法。