Java中void递归函数声明新数组变量仍引发原数组副作用的问题
问题分析:Java数组引用导致的原数组被修改问题
这是个非常典型的Java引用类型认知误区,我来帮你把问题拆明白:
核心问题:数组是引用类型,变量赋值只是传递引用
你代码里的这一行是关键:
int[] newNums = nums; // 声明新数组变量
你以为这是创建了一个新的数组对象,但实际上Java中的数组属于引用类型,这行代码只是让newNums这个变量和nums指向了内存中同一个数组对象。打个比方:就像你给同一个房子配了两把钥匙,nums是第一把,newNums是第二把,用第二把钥匙修改房子里的东西,用第一把钥匙开门进去看,自然也会看到修改后的结果。
所以当你执行newNums[i] = -1;时,本质上是在修改nums指向的那个原数组,因为它们指向的是同一个内存地址的数组对象。
验证这个逻辑的小例子
你可以跑一下这段极简代码,就能直观感受到:
public class Test { public static void main(String[] args) { int[] original = {1,2,3}; int[] alias = original; alias[0] = -1; System.out.println(original[0]); // 输出-1,而不是1! } }
解决办法:创建真正的新数组
如果你想让newNums是一个独立的数组,修改它不影响原nums,需要显式复制原数组的内容。可以用Arrays.copyOf方法(需要导入java.util.Arrays):
int[] newNums = Arrays.copyOf(nums, nums.length);
或者手动遍历数组复制每个元素:
int[] newNums = new int[nums.length]; for (int j = 0; j < nums.length; j++) { newNums[j] = nums[j]; }
这样newNums就是一个全新的数组对象,修改它的元素就不会影响原nums了。
回到你的代码
修改后,print(nums)就会输出你预期的未修改原数组,因为递归中修改的是独立的新数组,原数组始终保持初始状态。
内容的提问来源于stack exchange,提问作者Stacking_Flow
相关产品推荐
相关产品推荐

