java数组克隆需创建独立副本,主流方式有四种:system.arraycopy()高性能灵活但需预建目标数组;arrays.copyof()一行完成复制或扩容缩容;clone()语法最简,基本类型深拷贝、对象数组浅拷贝;arrays.copyofrange()精准截取子数组。

Java 中数组克隆不是简单赋值,而是创建独立副本的关键操作。直接用 = 只是复制引用,两个变量指向同一块内存,改一个就影响另一个。真正克隆必须生成新数组对象,主流方式有四种,各适用于不同场景。
System.arraycopy():高性能、灵活控制的底层复制
这是 JVM 原生支持的高效方法,底层由 C 实现,性能最优,适合对性能敏感或需精确控制复制范围的场景。
- 必须提前创建目标数组,否则抛
NullPointerException - 支持任意起始位置和长度,可实现“部分复制”“错位粘贴”等操作
- 参数顺序固定:源数组、源起点、目标数组、目标起点、复制个数
示例:从原数组第1位开始,复制3个元素到目标数组第2位起
int[] src = {1, 2, 3, 4, 5};int[] dest = new int[5];
System.arraycopy(src, 1, dest, 2, 3); // 结果:[0, 0, 2, 3, 4]
Arrays.copyOf():一行搞定完整复制或扩容缩容
封装了 System.arraycopy(),使用更简洁,适合快速复制整个数组,或需要调整长度的场合。
- 无需手动创建目标数组,方法内部自动分配
- 若新长度大于原数组,多出位置填默认值(
int为 0,String为null) - 若新长度小于原数组,则只取前 N 个元素
示例:复制并扩展为8元素数组,后3位自动补0
int[] newScores = Arrays.copyOf(scores, 8); // [57, 81, 68, 75, 91, 0, 0, 0]
clone():最简语法,基本类型深拷贝,对象数组浅拷贝
所有数组都继承自 Object,天然支持 clone(),调用即得副本,代码最短。
- 对
int[]、double[]等基本类型数组,clone 是深拷贝——内容完全独立 - 对
String[]、Person[]等引用类型数组,clone 是浅拷贝——数组对象是新的,但每个元素仍指向原对象 - 无需实现
Cloneable接口(数组类已内置支持)
示例:修改克隆后的对象数组元素,会影响原数组对应对象
Person[] people = {new Person("Alice")};Person[] copied = people.clone();
copied[0].setName("Bob"); // 原 people[0] 名字也变成 Bob
Arrays.copyOfRange():精准截取子数组
当只需复制某一段连续区间时,这个方法最直观,避免手动算起止索引和长度。
- 自动创建新数组,长度等于指定范围(
to - from) - 索引边界遵循“左闭右开”,即包含
from,不包含to - 越界会抛
ArrayIndexOutOfBoundsException
示例:提取下标 1 到 3(不含3)的两个元素
char[] chars = {'a', 'b', 'c', 'd'};char[] sub = Arrays.copyOfRange(chars, 1, 3); // ['b', 'c']
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











