Java中clone()对数组执行浅拷贝:基本类型数组完全独立,引用类型数组仅复制引用,不递归克隆元素对象;深拷贝需手动遍历、序列化或第三方库实现。

Java 中的 clone() 方法对数组执行的是浅拷贝,这意味着它只复制数组本身(即引用类型数组的引用,或基本类型数组的值),但不递归复制数组元素所指向的对象。
浅拷贝对基本类型数组是安全的
对于 int[]、double[] 等基本类型数组,clone() 创建一个新数组,其中每个元素都是原数组对应位置值的副本。两个数组完全独立,修改互不影响。
例如:
int[] a = {1, 2, 3};int[] b = a.clone();
b[0] = 99;
// a 仍是 {1, 2, 3},b 变为 {99, 2, 3}
浅拷贝对引用类型数组仅复制引用
对于 String[]、Object[]、自定义对象数组等,clone() 新建数组,但每个元素仍指向原数组中相同的对象。修改某个对象的状态,会影响两个数组看到的结果。
立即学习“Java免费学习笔记(深入)”;
常见误区:以为“数组被复制了,里面的东西也跟着复制了”——其实没有。
- 数组对象本身是新的(a != b)
- a[0] 和 b[0] 指向同一个对象(a[0] == b[0])
- 若调用 a[0].setName("X"),b[0].getName() 也会返回 "X"
无法通过 clone() 实现深拷贝
clone() 是 Object 的受保护方法,数组类重写了它,但仅支持一层复制。要实现真正独立的副本(深拷贝),需手动遍历并克隆每个元素,或借助序列化、第三方库(如 Apache Commons Lang 的 SerializationUtils)、或使用构造器/工厂方法。
注意:并非所有对象都支持 clone(),且需确保元素类型实现了 Cloneable 并正确重写 clone() 方法,否则会抛 CloneNotSupportedException。
替代方案更可控、更明确
相比依赖 clone(),显式创建新数组并逐个赋值(或使用 Arrays.copyOf)语义更清晰,也便于插入深拷贝逻辑:
- 基本类型:用 Arrays.copyOf(arr, arr.length) 或直接 new + for 循环
- 引用类型:new Object[arr.length]; for (int i = 0; i
- 不确定是否可克隆时,优先考虑不可变设计或使用 builder 模式构造新实例
浅拷贝不是 bug,而是设计选择;理解它“只复制一层”的本质,才能避免共享状态引发的隐蔽问题。








