java一维数组调用clone()创建新数组对象:基本类型数组实现值级深拷贝,互不影响;引用类型数组仅浅拷贝引用,共享对象状态。

一维数组调用 clone() 方法会创建一个**新数组对象**,在堆内存中分配独立空间,与原数组互不干扰——这是关键前提。
基本类型数组:真正意义上的深拷贝
当数组元素是 int、double、boolean 等基本类型时,clone() 不仅新建数组容器,还逐个复制元素值。两个数组各自持有完整数据副本:
- 修改原数组某个索引的值(如
arr[0] = 99),不会影响 clone 出的数组 - 两个数组的
==比较为false,Arrays.equals()为true(内容相同) - 底层实际等价于新开辟一块连续内存,并用
System.arraycopy快速填充
引用类型数组:只拷贝一层引用(浅拷贝)
若数组元素是对象(如 String[]、Person[]),clone() 仅复制每个元素的**引用地址**,不递归克隆对象本身:
- 新旧数组长度相同、各位置引用指向同一组对象
- 改变数组中某个引用(如
copy[0] = new String("x"))不影响原数组——因为只是改了 copy 的某格指针 - 但若通过
copy[0].someField = ...修改了共享对象的内部状态,原数组对应位置也会看到变化
内存开销可控,但需注意对象生命周期
clone() 创建的新数组本身占用额外堆内存,大小等于原数组元素所占字节数(基本类型)或引用大小(64位 JVM 下通常为 8 字节/元素)。它不触发 GC,也不影响原数组的可达性:
- 只要原数组或 clone 数组任一仍被强引用,其元素对象就可能继续存活
- 对
String[]这类不可变对象,浅拷贝实际很安全;但对可变对象(如自定义类实例数组),需自行决定是否深度克隆内部对象 - 相比
Arrays.copyOf()或循环赋值,clone() 性能略优,因底层直接调用 JVM 优化的内存拷贝指令
不是所有“数组”都适用 clone 的预期行为
注意:clone() 对一维数组有效且语义清晰,但对二维及以上维度数组,它只复制最外层数组和其中的引用,不触及内层数组内容。例如 int[][] clone 后,外层数组是新的,但每个 int[] 子数组仍是原引用——这容易引发误判。一维场景下无此问题。











