Java数组复制的五种常用方法及对比
在Java开发中,数组复制是常见的基础操作。本文梳理了五种主流实现方式,涵盖从底层位移到API封装的各种手段,并附带完整测试代码与结果验证。
5种数组复制方法
第1步:使用for循环手动赋值(基础法)
这是最直观的实现方式,通过遍历原数组将元素逐一写入新数组或已分配空间的数组中。其核心优势在于逻辑简单易懂,但代码量相对较多,且性能取决于JIT编译优化。
操作示例:
public static void method01(int[] arr, int[] ans) {
for (int i = 0; i < arr.length; i++) {
ans[i] = arr[i];
}
System.out.println("原始复制方法:" + Arrays.toString(ans));
}
第2步:使用 Arrays.copyOf() 方法
Arrays.copyOf() 会根据指定长度创建一个新的数组对象。如果指定长度大于原数组长度,多余部分用默认值填充;若小于原长度,则截断。该方法会返回新数组引用,原有目标数组会被丢弃(重构)。
语法结构:
Arrays.copyOf(dataType[] srcArray, int length)
注意: 此方法适用于需要扩容或缩容的场景。若只需精确拷贝,需传入原数组长度。
ans = Arrays.copyOf(arr, arr.length); // 精确拷贝
ans = Arrays.copyOf(arr, arr.length + 3); // 扩容拷贝
第3步:使用 Arrays.copyOfRange() 方法
当只需要复制数组的某一段区间时使用此方法。startIndex 包含在内,endIndex 不包含在内。它同样会生成一个新数组。
语法结构:
Arrays.copyOfRange(srcArray, int startIndex, int endIndex)
// 示例:复制索引0到length之间的所有元素
ans = Arrays.copyOfRange(arr, 0, arr.length + 3);
第4步:使用 System.arraycopy() 方法(最高效)
该方法位于 java.lang.System 类中,是底层C/C++实现的本地方法,执行效率通常高于其他几种方式。它要求目标数组必须预先存在,且直接修改目标数组内容,而非返回新数组。
参数说明:
srcArray:源数组srcIndex:源数组起始位置destArray:目标数组destIndex:目标数组起始位置length:要复制的元素个数
关键约束: srcIndex + length <= srcArray.length 且 destIndex + length <= destArray.length,否则抛出 IndexOutOfBoundsException。
System.arraycopy(arr, 0, ans, 0, arr.length);
第5步:使用 Object.clone() 方法
数组本身继承自 Object,因此可直接调用 clone() 方法创建副本。这是一种简洁的浅拷贝方式,返回的是与原数组类型相同的新数组。
语法结构:
newArr = originalArr.clone();
public static void method05(int[] arr, int[] ans) {
ans = arr.clone(); // 强制转换可能隐含在上下文中,此处为基本类型无影响
System.out.println("clone()方法:" + Arrays.toString(ans));
}
重要概念:浅拷贝与深拷贝
上述所有针对 int[]、double[] 等基本数据类型数组的复制均为浅拷贝。对于基本类型,数据存储在栈或堆的直接内存中,复制后两个数组互不影响。
但如果数组包含对象(如 String[] 或自定义对象数组),clone() 和 arraycopy 仅复制对象的引用地址。修改一个数组中对象的内容,会影响另一个数组中的对应对象。若需完全独立的深拷贝,需手动遍历并实例化每个子对象。
性能与场景总结
- System.arraycopy:速度快,适合大量数据的移动或覆盖,需预先分配目标空间。
- Arrays.copyOf/copyOfRange:代码简洁,自动处理内存分配,适合需要根据长度变化动态调整数组的场景。
- clone():语义清晰,适合快速制作当前数组的一份镜像。
- for循环:灵活性最高,可在赋值过程中进行过滤、转换等操作。
完整测试用例
以下代码演示了前四种方法与 clone 的实际输出结果:
package com.zhuang;
import java.util.Arrays;
public class ArrayCopyTest {
public static void main(String[] args) {
int[] arr = new int[] { 57, 81, 68, 75, 91 };
int[] ans = new int[arr.length];
// 1. 循环复制
for (int i = 0; i < arr.length; i++) ans[i] = arr[i];
System.out.println("Loop: " + Arrays.toString(ans));
// 2. copyOf
ans = Arrays.copyOf(arr, arr.length);
System.out.println("copyOf: " + Arrays.toString(ans));
// 3. copyOfRange
ans = Arrays.copyOfRange(arr, 0, arr.length);
System.out.println("copyOfRange: " + Arrays.toString(ans));
// 4. arraycopy
ans = new int[arr.length];
System.arraycopy(arr, 0, ans, 0, arr.length);
System.out.println("arraycopy: " + Arrays.toString(ans));
// 5. clone
ans = (int[]) arr.clone();
System.out.println("clone: " + Arrays.toString(ans));
}
}
以上就是Java数组复制方法的详细内容,更多关于Java数组操作技巧的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













