Java数组clone()执行浅拷贝:基本类型数组完全独立,引用类型数组仅复制引用地址;无法直接深拷贝,需手动遍历克隆元素或改用Arrays.copyOf、序列化、不可变对象等替代方案。

Java 数组的 clone() 方法执行的是浅拷贝,它只复制数组容器本身,不递归复制其中的对象元素。理解这一点,是避免共享状态 bug 的关键。
基本类型数组:完全独立
对 int[]、double[]、boolean[] 等基本类型数组调用 clone(),会创建一个新数组,并把每个元素的值逐个复制过去。两个数组内存隔离,互不影响。
- 修改克隆数组的某个元素,原数组内容不变
- 这是最安全、最常用的情形,无需额外处理
引用类型数组:仅复制引用
对 String[]、Person[]、Object[] 等引用类型数组调用 clone(),会新建一个数组对象,但每个位置存放的仍是原数组中对应对象的引用地址。
- 两个数组的长度、顺序一致,但它们的元素指向同一堆内存中的对象
- 若通过克隆数组修改某个对象的状态(如 arr2[0].setName("X")),原数组看到的也是这个变化
- 这不是 bug,而是设计如此——clone 只做“一层”复制
无法直接实现深拷贝
clone() 本身不支持递归克隆。即使数组元素类型实现了 Cloneable 并重写了 clone(),也需手动遍历并调用每个元素的克隆逻辑。
立即学习“Java免费学习笔记(深入)”;
- 直接写 arr.clone() 永远得不到深拷贝
- 常见替代方式包括:用 Arrays.copyOf() + 循环克隆每个元素、使用序列化(如 SerializationUtils.clone())、或改用不可变对象设计
- 若元素类型未实现 Cloneable 或 clone() 抛异常,则必须换方案(如构造新实例)
语义清晰的替代写法更推荐
相比依赖 clone(),显式创建数组并赋值往往更可控、更易维护。
- 基本类型:用 Arrays.copyOf(arr, arr.length) 或 new int[arr.length] + for 循环
- 引用类型:先 new 新数组,再逐个判断是否可克隆,或统一用工厂方法/构造器生成新对象
- 尤其在不确定元素是否支持克隆时,主动构造比隐式 clone 更可靠


















