二维数组浅拷贝仅复制外层引用,内层数组共享内存;深拷贝则逐层新建内存,完全独立。浅拷贝如clone()或=赋值,a[0]==b[0]为true;深拷贝需外层new+内层arrays.copyof()等逐行复制。

二维数组的浅拷贝和深拷贝本质区别在于:是否真正复制了所有层级的数据。浅拷贝只复制第一层引用,内层数组仍共享内存;深拷贝则逐层复制,新旧数组完全独立。
浅拷贝:只复制外层数组引用
Java 中对二维数组调用 clone() 或直接赋值(=),都属于浅拷贝。它只复制了外层数组的引用,而每个子数组(即每一行)仍是原对象的同一份引用。
- 例如:
int[][] a = {{1,2}, {3,4}}; int[][] b = a.clone();→b和a指向不同的一维数组对象,但b[0]和a[0]指向同一个一维数组 - 修改
b[0][0] = 99,a[0][0]也会变成 99 - 验证方式:
a[0] == b[0]返回 true
深拷贝:逐行复制,彻底隔离
深拷贝需确保外层数组和每个子数组都新建内存空间。常见做法是先创建新外层数组,再对每一行单独拷贝。
- 使用
Arrays.copyOf()配合循环:b[i] = Arrays.copyOf(a[i], a[i].length) - 用
System.arraycopy()逐行复制 - 手动遍历赋值:
b[i][j] = a[i][j](适用于规则二维数组) - 注意:
Arrays.copyOf(a, a.length)对二维数组仍是浅拷贝,不能省略内层复制
不规则二维数组也要逐行处理
Java 中没有真正的“二维数组”,只有“数组的数组”。不规则结构(如 int[][] arr = {{1}, {2,3,4}, {5,6}})更凸显深拷贝必要性——每行长度不同,必须分别分配和复制。
- 错误写法:
arr2 = arr.clone()→ 行引用仍共享 - 正确写法:先
arr2 = new int[arr.length][],再对每个i执行arr2[i] = Arrays.copyOf(arr[i], arr[i].length) - 若子数组含对象(如
String[]),Arrays.copyOf()对基本类型和不可变对象安全;若含可变对象(如自定义类),还需对其内部做深拷贝
常见误区与提醒
别被表象迷惑:基本类型数组的 clone() 在一维时表现像深拷贝,但在二维中只是“浅一层”。关键看修改子元素是否影响原数组。
-
int[]一维 clone → 安全(值类型) -
int[][]直接 clone → 不安全(第二层未复制) -
String[][]用Arrays.copyOf()逐行复制 → 安全(String不可变,且地址已分离) - 涉及自定义对象时,仅靠
Arrays.copyOf()不够,需重写clone()或用构造器/序列化等手段递归深拷贝











