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

修改int数组后存入Stack却全为最终数组?Java数组引用问题求助

问题原因与解决方法

核心原因

Java里数组属于引用类型,你代码中每次调用perm.add(value)时,并没有把当前数组的内容复制一份存进Stack,而是把value数组的引用地址存了进去。整个全排列生成过程中,你一直在修改同一个value数组的元素值,Stack里所有元素其实都指向同一个数组对象。当循环结束时,数组内容已经变成最后一个排列321,所以打印Stack时所有元素显示的都是这个值。

解决方案

每次向Stack添加数组前,先创建当前数组的副本,把副本存入Stack,而不是原数组的引用。可以用Arrays.copyOf()方法快速生成数组副本,该方法会创建一个新数组,并复制原数组的所有元素。

修改后的代码

import java.util.Arrays;
import java.util.Stack;

public class PermutationExample {
    public Stack<int[]> perm(int[] labels) {
        Stack<int[]> perm = new Stack<int[]>();

        int[] value = labels;
        Arrays.sort(value);
        int k = labels.length;

        boolean permutationsComplete = false;
        // 存入数组副本而非原引用
        perm.add(Arrays.copyOf(value, value.length));

        while (!permutationsComplete) {
            
            int i = k - 1;
            while (i > 0 && value[i - 1] >= value[i]) {
                i--;
            }

            if (i < 1) {
                permutationsComplete = true;
                System.out.println();
                for(int[] list : perm) {
                    this.printList(list);
                }
                return perm;
            }

            int j = k;
            while (value[j - 1] <= value[i - 1]) {
                j--;
            }

            int swap1 = value[i - 1];
            value[i - 1] = value[j - 1];
            value[j - 1] = swap1;

            i++;
            j = k;

            while (i < j) {
                int swap2 = value[i - 1];
                value[i - 1] = value[j - 1];
                value[j - 1] = swap2;
                i++;
                j--;
            }
            // 同样存入数组副本
            perm.add(Arrays.copyOf(value, value.length));
        }
        return null;
    }

    private void printList(int[] arr) {
        for (int num : arr) {
            System.out.print(num);
        }
        System.out.println();
    }
}

验证效果

修改后,每次存入Stack的都是独立的数组对象,每个对象保存了生成时的排列状态,最后打印Stack时就能正确显示所有不同的全排列了。

内容的提问来源于stack exchange,提问作者Tabiat1739

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 11:26:11