java数组参数传递是值传递(传递引用的副本),形参和实参指向同一堆内存,修改元素会影响原数组,但重赋值形参(如arr2=new int[]{})只改变局部引用,不影响实参。

Java 中数组参数传递不是真正的“引用传递”,而是“传递引用的副本”,也就是值传递的一种特殊形式。理解这一点,就能避免绝大多数因误判传参行为导致的 bug。
数组变量存的是地址,不是数据本身
声明 int[] arr = {1, 2, 3}; 时:
- 堆内存中分配连续空间存储三个 int 值,比如地址是 0x0011
- 栈中变量 arr 存储的只是这个地址(0x0011),不是数组内容
- 所以 arr 本质是一个“指向数组的指针变量”
传入方法时,复制的是这个地址,不是数组
调用 change(arr) 时:
- JVM 把 arr 的值(即地址 0x0011)复制一份,赋给形参 arr2
- 此时 arr 和 arr2 是两个独立变量,但值相同,都指向同一块堆内存
- 因此通过 arr2[0] = 99 修改元素,原数组 arr[0] 也会变成 99
但重赋值形参,不会影响实参
如果在方法里写:
- arr2 = new int[]{4, 5, 6}; → 只让 arr2 指向新数组,arr 仍指向旧地址
- arr2 = null; → 仅清空形参引用,实参 arr 不受影响
- 这种操作不会改变调用方看到的数组,因为没动原始地址值
需要原地修改时,必须操作元素,不能换引用
比如实现 void rotate(int[] nums):
- ❌ 错误:nums = newArr;(只改了形参指向)
- ✅ 正确:System.arraycopy(newArr, 0, nums, 0, nums.length); 或逐个赋值
- 关键:所有修改必须落在原数组对象的元素上,而不是替换数组变量本身
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











