java二维数组传参传递的是外层数组对象的引用,修改元素或某行引用会影响原数组,但重赋值参数变量无效;其内存结构为“数组的数组”,外层存引用、内层各行独立分配于堆中。

Java 二维数组传参,本质上传递的是外层数组对象的引用,不是数据副本。修改元素或某一行内容会直接影响原数组;但给参数变量重新赋值(如 matrix = new int[5][5])不会改变原始引用。
二维数组在内存中怎么存的
Java 没有真正意义上的“连续二维内存”,而是“数组的数组”:
- 外层数组(如
int[][] arr)是一个一维数组,每个元素是int[]类型的引用; - 这些引用分别指向堆中独立的一维数组(即每一行);
- 变量名(如
arr)存在栈中,只保存外层数组对象在堆中的地址; - 所有子数组(
arr[0]、arr[1]…)也都在堆中,外层数组里存的是它们的地址。
传参后哪些操作会影响原数组
方法内通过参数名操作时,效果取决于操作类型:
- ✅ 修改某个元素:
matrix[i][j] = 99→ 堆中对应位置被改,原数组同步变化; - ✅ 替换某一行:
matrix[0] = new int[]{1, 2, 3}→ 外层数组第 0 个引用被更新,原数组该行指向新数组; - ❌ 重赋值整个参数:
matrix = new int[4][4]→ 只改变栈中形参变量的指向,不影响调用方的变量。
什么时候需要深拷贝
当方法内部要自由修改数组结构(比如打乱行顺序、增删行、逐行重分配),又不希望影响调用方数据时,必须深拷贝:
- 浅拷贝(如
Arrays.copyOf(matrix, matrix.length))只复制外层数组,各行仍共用原引用; - 深拷贝需为每一行单独复制:
for (int i = 0; i ; - 也可用
Arrays.deepCopy()(适用于元素为可序列化类型的二维数组)。
常见误区提醒
别把“传引用”误解成“传对象本身”或“传指针”:
- Java 所有参数都是“按值传递”,只不过引用类型传的是地址值的副本;
- “能改内容”是因为副本地址和原地址指向同一块堆内存;
- “改不了引用本身”是因为形参变量是独立的栈空间,赋新地址只影响它自己。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











