在 Java 中,数组拷贝有多种方法,每种方法适用于不同的场景。以下是常见的数组拷贝方式及示例:
1. 使用 for
循环手动拷贝
特点:简单直接,适合小数组或需要自定义操作的场景。
int[] src = {1, 2, 3, 4, 5};
int[] dest = new int[src.length];for (int i = 0; i < src.length; i++) {dest[i] = src[i];
}
2. 使用 System.arraycopy()
特点:高效(底层是 Native 方法),适合任意类型的数组。
int[] src = {1, 2, 3, 4, 5};
int[] dest = new int[src.length];// 参数:源数组, 源起始位置, 目标数组, 目标起始位置, 拷贝长度
System.arraycopy(src, 0, dest, 0, src.length);
3. 使用 Arrays.copyOf()
特点:简洁,适合拷贝整个数组或扩展数组长度。
import java.util.Arrays;int[] src = {1, 2, 3, 4, 5};
int[] dest = Arrays.copyOf(src, src.length); // 拷贝整个数组
int[] partialCopy = Arrays.copyOf(src, 3); // 拷贝前3个元素
4. 使用 Arrays.copyOfRange()
特点:拷贝数组的指定范围。
import java.util.Arrays;int[] src = {1, 2, 3, 4, 5};
int[] dest = Arrays.copyOfRange(src, 1, 4); // 拷贝索引1到3的元素(左闭右开)
// 结果:{2, 3, 4}
5. 使用 clone()
方法
特点:直接调用数组对象的 clone()
方法,简洁但可能引发深浅拷贝问题。
int[] src = {1, 2, 3, 4, 5};
int[] dest = src.clone(); // 浅拷贝
浅拷贝 vs 深拷贝
-
浅拷贝:上述方法均为浅拷贝。如果数组元素是对象,拷贝后的数组和原数组引用同一对象。
class Person { String name; }Person[] src = {new Person("Alice"), new Person("Bob")}; Person[] dest = Arrays.copyOf(src, src.length);// 修改 dest[0] 会影响 src[0] dest[0].name = "Charlie"; System.out.println(src[0].name); // 输出 "Charlie"
-
深拷贝:需要手动复制对象或使用序列化。
// 示例:手动深拷贝 Person[] dest = new Person[src.length]; for (int i = 0; i < src.length; i++) {dest[i] = new Person(src[i].name); }
性能比较
- 最快:
System.arraycopy()
(底层优化)。 - 最灵活:
Arrays.copyOf()
和Arrays.copyOfRange()
(内部调用System.arraycopy
)。 - 最直观:
for
循环(适合简单逻辑)。
注意事项
- 目标数组长度必须足够,否则抛出
ArrayIndexOutOfBoundsException
。 - 多维数组(如
int[][]
)的拷贝需要逐层处理(如遍历每一行拷贝)。
根据具体需求选择合适的方法!