Java变量保存

标签 java arrays variables multidimensional-array

我遇到了一个问题,但我不知道如何解决。

我想创建一个类,其中 2D int 数组保存两次。一次是最后一次保持原样,一次是我可以修改的。

简而言之,我的类(class)如下所示:

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() 方法执行浅复制 - 这意味着它将数组的内容复制到另一个数组,但是二维数组仅包含对一维数组的引用!这样就不行了。

关于Java变量保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21660329/

相关文章:

Javascript 局部变量声明

c++ - 为什么我程序中的一个变量使用了 60% 的执行时间?

java - 为什么 "<= 1"没有按预期工作?

java - Gradle 包装器 : command not found?

python - 我如何在python中按值分配

ios - 我想将每个单元格链接到不同的 URL

java - ApplicationContextAware 与 Setter 注入(inject)

java - 有人可以向我解释一下这个递归背后的逻辑吗

arrays - 初学者 : When working with arrays, 为什么这个有效但这个不行?

.net - .Net 和 C++ 中的静态变量如何工作?