Java数组深度克隆需切断所有引用链:基本类型或String数组用Arrays.copyOf()即可;Person等可克隆对象数组须手动遍历调用clone()。

Java数组的深度克隆不是简单复制,关键在于切断所有引用链,让副本和原数组彻底互不影响。基本类型数组(如int[])容易处理,但含对象、嵌套结构或可变字段的数组必须逐层复制内存内容,否则改副本会连带影响原数据。
一维基本类型或不可变对象数组:用Arrays.copyOf()最稳妥
对int[]、double[]、String[]这类数组,Arrays.copyOf()是高效又安全的选择。它底层调用System.arraycopy(),生成全新内存块,元素值完全独立。
- 直接写:int[] copy = Arrays.copyOf(src, src.length);
- String[]也适用,因为String不可变,即使引用被复制,内容也不会被意外修改
- ⚠️ 注意:若数组元素是自定义类(如Person[]),此方法只复制引用,不算真正深拷贝
对象数组且类支持克隆:手动遍历+调用clone()
当数组元素是实现了Cloneable接口并重写了clone()方法的类时,需逐个克隆元素,确保内部字段也被复制。
- 先创建新数组:Person[] copy = new Person[src.length];
- 再循环克隆每个元素:for (int i = 0; i
- 关键点:Person类中的clone()必须递归克隆其可变字段(比如内部List、Date等),否则仍是浅拷贝
任意复杂结构通用方案:序列化反序列化
适用于含多层嵌套、集合、自定义对象甚至循环引用(需额外标记transient或定制序列化)的数组,无需修改原有类结构。
立即学习“Java免费学习笔记(深入)”;
- 要求所有元素及嵌套类型都实现Serializable接口
- 核心逻辑:把数组写入字节数组流 → 再从流中读出新对象
- 缺点是性能开销大,不支持transient字段,且存在安全限制(如反序列化漏洞需防范)
追求开发效率:引入第三方库快速落地
Apache Commons Lang的SerializationUtils.clone()或Gson的toJson/fromJson组合,能大幅简化代码。
- 例如用Gson:String json = new Gson().toJson(src); T[] copy = new Gson().fromJson(json, src.getClass());
- 优势是不用关心Serializable或Cloneable契约,适合快速验证或原型开发
- 注意Gson默认不处理泛型擦除和某些特殊类型(如Enum、LocalDateTime),需配置TypeAdapter


















