You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 12:59:06