
本文详解为何java中直接赋值二维数组会导致原数组被修改,并提供深拷贝解决方案,确保方法操作不会影响原始数据。
本文详解为何java中直接赋值二维数组会导致原数组被修改,并提供深拷贝解决方案,确保方法操作不会影响原始数据。
在Java中,int[][] copyArr = arr; 这行代码并未创建新数组,而只是将 arr 的引用(即内存地址)赋给了 copyArr —— 二者指向同一块堆内存中的二维数组对象。因此,后续对 copyArr[i][j] 的任何修改(如 copyArr[j - 1][k] = 0),实际上就是在修改原始 arr 的内容。这正是您调用 submatrix() 多次后发现“数组状态被污染”的根本原因。
要真正隔离原始数组,必须执行深拷贝(Deep Copy):为外层数组和每一行内层数组都创建独立副本。以下是修正后的 submatrix 方法关键改进部分:
public static int[][] submatrix(int[][] arr, int i, int j) {
// ✅ 正确的深拷贝:逐行复制
int[][] copyArr = new int[arr.length][];
for (int x = 0; x <p>⚠️ 注意事项:</p>
- arr.clone() 对二维数组仅执行浅拷贝(外层数组复制,但每行仍共享引用),不可直接使用;
- 必须对每一行调用 .clone() 或 Arrays.copyOf() 才能实现完整深拷贝;
- 若数组可能为 null,需提前校验,避免 NullPointerException;
- 对于大型数组,深拷贝有性能开销,若仅需读取可考虑设计为不可变接口或使用 List
- > 配合 Collections.unmodifiable*。
通过以上改造,每次调用 submatrix() 都会基于原始数组的纯净副本进行运算,彻底杜绝副作用,保障方法的幂等性与线程安全性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











