java中所有参数都是值传递,数组传的是引用的副本;修改元素有效,更换数组引用无效,因只改变形参指向。

Java 中所有参数都是值传递,数组也不例外——传的是数组引用的副本,不是数组本身,也不是真正的“引用传递”。理解这点,就能解释为什么改元素有效、换数组无效。
数组变量存的是地址,传参时复制这个地址
数组是对象,变量(比如 int[] nums)并不直接存数据,而是存堆中数组对象的内存地址。当它作为参数传入方法时,JVM 把这个地址值复制一份给形参。两个变量(实参和形参)各自持有相同的地址值,指向同一块堆内存。
- 所以通过 nums[i] = x 修改元素,就是在操作堆里的原始数据,调用方能看见
- 但执行 nums = new int[]{...},只是让形参变量指向新地址,实参变量的地址值没变,仍指着原来的数组
改内容 vs 换引用:效果完全不同
关键看你在方法里动的是“堆里的东西”,还是“栈里的变量”:
- ✅ 有效操作(原地生效):遍历赋值、反转、交换元素、调用 Arrays.fill() 等——都作用于堆中数组本体
- ❌ 无效操作(对外无感):nums = newArr、nums = Arrays.copyOf(...)、nums = null——只改了形参这个局部变量的指向
二维数组也遵循同一逻辑
二维数组 int[][] matrix 的外层数组也是对象,传参同样复制其引用。因此:
- matrix[0][1] = 99 → 改的是堆中某行某列的值,原数组可见
- matrix[0] = new int[]{1,2} → 替换第 0 行的引用,原数组第 0 行会变(因为外层数组里存的就是行引用)
- matrix = new int[3][3] → 只让形参变量指向新二维数组,原变量不变
想“换数组”又保持 void 方法?得拷贝回原空间
如果算法逻辑依赖辅助数组(比如旋转、归并),又必须用 void 方法且原地生效,不能靠返回新数组,那就得手动把结果写回去:
- 用循环逐个赋值:for (int i = 0; i
- 或用 System.arraycopy(newArr, 0, nums, 0, newArr.length);
- 避免写 nums = newArr;——这行代码在 void 方法里等于白写
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











