java数组clone()对基本类型是深拷贝,对引用类型仅浅拷贝;二维数组clone()只复制外层,内层数组仍共享;安全深拷贝需按类型分层处理:基本类型用clone(),引用类型需手动逐元素深拷贝,嵌套结构宜用序列化。

Java 数组本身是对象,其拷贝行为取决于数组元素类型和拷贝方式。基本类型数组用 clone() 是深拷贝;引用类型数组用 clone() 只是浅拷贝——复制了数组容器和元素引用,但不复制元素对象本身。真正安全的深拷贝需结合类型特征分层处理。
基本类型数组:clone() 就是深拷贝
int[]、double[]、boolean[] 等基本类型数组调用 clone() 后,新数组与原数组完全独立。每个元素值被逐个复制到新内存空间,修改任一数组不影响另一个。
- 底层直接复制栈中数值或连续堆内存块,无引用共享问题
- 无需实现
Cloneable接口,数组类已默认支持clone() - 示例:
int[] a = {1, 2, 3}; int[] b = a.clone(); b[0] = 99; // a 仍是 [1, 2, 3]
引用类型数组:clone() 仅复制一层引用
String[]、Person[]、List[] 这类数组调用 clone(),只复制数组对象本身和其中每个元素的引用地址,所有元素对象仍被两个数组共享。
- 数组容器是新的,但内部元素指向同一堆内存对象
- 修改
b[i].setName("X")会同步反映在a[i]上 - 若需完全隔离,必须对每个非 null 元素手动深拷贝(如调用其
clone()或构造新实例)
二维及多维数组的拷贝陷阱
int[][] 或 String[][] 的拷贝更易出错。clone() 对二维数组只执行“浅层二维”拷贝:外层数组是新对象,但每个内层数组仍是原引用。
-
int[][] m = {{1,2}, {3,4}}; int[][] n = m.clone();→n[0] == m[0]为 true - 修改
n[0][0] = 9不影响m(因 int 是基本类型) - 但若为
String[][],改n[0][0]虽不改变字符串内容(String 不可变),若换成可变对象(如 StringBuilder[]),就会相互干扰
安全深拷贝的实用组合策略
不依赖单一机制,按需组合才能兼顾正确性与可控性:
- 基本类型数组:直接用
clone()或Arrays.copyOf()—— 简单高效 - 引用类型一维数组:遍历 + 每个元素调用其自有深拷贝逻辑(如实现
Cloneable并重写clone()) - 嵌套结构(如 Object[][]):优先考虑序列化(如
ObjectOutputStream)或 JSON 序列化(如 JacksonreadValue(writeValueAsBytes())),避开手工递归 - 明确不可变场景(如 String[]、Integer[]):浅拷贝足够,无需深拷贝开销
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











