堆栈中的push(int[][])复制的值与Java相同

堆栈中的push(int[][])复制的值与Java相同,java,stack,stack-trace,Java,Stack,Stack Trace,我有一个二维数组和堆栈: int[][] data = new int[][]; Stack<int[][]> undoList = new Stack<int[][]>(10); 那么为什么所有堆栈元素都具有相同的值呢?您正在对数组进行更改,但没有将数组本身放在堆栈上。。。您正在堆栈上放置对数组的引用。基本上,您多次推送相同的引用。如果需要独立的值,则需要独立的数组 把引用想象成有点像写在纸上的街道地址(纸通常是一个变量)。你现在得到的是一本书,每一页上都有相同的街道

我有一个二维数组和堆栈:

int[][] data = new int[][];
Stack<int[][]> undoList = new Stack<int[][]>(10);

那么为什么所有堆栈元素都具有相同的值呢?

您正在对数组进行更改,但没有将数组本身放在堆栈上。。。您正在堆栈上放置对数组的引用。基本上,您多次推送相同的引用。如果需要独立的值,则需要独立的数组


把引用想象成有点像写在纸上的街道地址(纸通常是一个变量)。你现在得到的是一本书,每一页上都有相同的街道地址。你可能在每一页上都写了字,然后去粉刷房子的前门,但这并不意味着我们可以看到所有不同的颜色——只涉及一栋房子。如果你想拥有很多不同房子的街道地址,有很多不同颜色的前门,你需要建造很多不同的房子…

我通过复制代码解决了这个问题,正如@Marco13在上面的评论中提到的:

深度复制

public static int[][] deepCopyArray(int[][] oldArray){
        int[][] newArray = new int[oldArray.length][];
        for(int i=0; i<oldArray.length; i++)
        {
            newArray[i] = new int[oldArray[i].length];
            for(int j=0; j<oldArray[i].length; j++)
                newArray[i][j] = oldArray[i][j];
        }
        return newArray;
    }
publicstaticint[]]deepCopyArray(int[]]oldArray){
int[]newArray=newint[oldArray.length][];

对于(int i=0;我觉得您正在使用存储在
数据中的同一引用。请在将其推入
堆栈之前创建一个新的
int[][]
。这当然是重复的重复…但我没有找到此链的开头。@Marco13是data.clone()在这里工作?单个
数组.copyOf
data.clone()
将不够。在进行“某些更改”之前,您必须对数组进行深度复制。有关2D阵列上的深度复制示例,请参见示例和其他。我不确定效率在此处的哪一点起作用。您必须创建阵列的深度复制。这可以像链接答案中那样完成(无论行的长度是否不同-对于等长的行,您将以相同的方式完成)。或者,对于每一行,可以使用
目标[i]=input[i].clone();
,而不是使用
数组.copyOf
,但这也必须对每一行执行,因此没有显著差异。
public static int[][] deepCopyArray(int[][] oldArray){
        int[][] newArray = new int[oldArray.length][];
        for(int i=0; i<oldArray.length; i++)
        {
            newArray[i] = new int[oldArray[i].length];
            for(int j=0; j<oldArray[i].length; j++)
                newArray[i][j] = oldArray[i][j];
        }
        return newArray;
    }