我有一个问题,但我不知道如何解决。

我想创建一个类,其中将二维int数组保存两次。最后一次保持原样,我可以修改一次。

简而言之,我的班级看起来像这样:

private static class Class {
    private final int[][] firstForm;
    private int[][] modify;

    public Class(int[][] firstForm){
        this.firstForm = firstForm;
        this.modify = firstForm;
//I also already tried .clone() on both
    }

    public void setValue(int x, int y, int val){
        if(firstForm[x][y]!=0){
            System.out.println("ERROR!);
            return;
        }
        modify[x][y]=val;
    }
}


现在,当我使用setValue函数时,不仅修改值更改,而且firstForm值也更改了。
我已经尝试过使用this.modify = firstForm.clone();,但是结果是相同的。有人可以帮助我,告诉我我做错了什么吗?

最佳答案

问题是您对final关键字的误解。

在这种情况下,final的作用是该变量将包含无法更改的引用。但是,可以更改引用的对象。

现在在您的代码中执行以下操作:

this.firstForm = firstForm;
this.modify = firstForm;


因此,两个变量都引用相同的引用,这意味着对数组所做的任何更改都将显示在firstFormmodify中。

您将必须复制阵列。有两种副本-浅副本和深副本。 Shallow会将数组的对象复制到另一个数组(具有不同的引用)中-这对于一个int数组就足够了。如果该数组是另一种对象类型,则必须进行深层复制以确保不变性。

要进行复制,请使用两个嵌套的for循环:

int[][] newarray = new int[firstForm.length][firstForm[0].length];

for(int i = 0; i < firstForm.length; i++){
  for(int j = 0; j  < firstForm[i].length; j++){
    newarray[i][j] = firstForm[i][j];
  }
}


请注意,clone()方法会进行浅表复制-这意味着它将数组的内容复制到另一个数组,但是二维数组仅包含对一维数组的引用!这样就无法正常工作。

10-08 14:11