我很迷茫。

这是我对基本变量和赋值的理解:

int a = 9;
int b = a;
int a = 8;
System.out.println(b); // This will be 9


现在,我正在尝试相同的操作,但不是使用基本类型,而是使用ArrayList二维结构,请参见以下代码:

public final class Matrix {
    private List<List<Double>> rawMatrix = new ArrayList<List<Double>>();
    private List<List<Double>> matrix = new ArrayList<List<Double>>();

    private void update(){
        matrix = rawMatrix;
        System.out.println("matrix: "+matrix.size()+", "+matrix.get(0).size());
        System.out.println("matrix: "+rawMatrix.size()+", "+rawMatrix.get(0).size());
        matrix.get(0).add(99.0);
        System.out.println("matrix: "+matrix.size()+", "+matrix.get(0).size());
        System.out.println("matrix: "+rawMatrix.size()+", "+rawMatrix.get(0).size());
    }
}


问题是此输出:

matrix: 4, 3
matrix: 4, 3
matrix: 4, 4
matrix: 4, 4


现在由于某种原因,即使我从未在rawMatrix结构上添加任何内容,matrix都添加了与rawMatrix相同的元素。

我认为这是通过引用分配变量的某种怪异类型,我不太了解为什么会这样,以及为什么它是Java中的默认值。

我该如何克服呢?我是否必须使用两个for循环来使矩阵之一与另一个相等,所以效率似乎很低。

最佳答案

由于ArrayLists是对象,因此分配仅将指针复制到该对象。
使用基本类型,您实际上是在复制值。

因此,这意味着您的提示matrix = rawMatrix;使matrix指向与rawMatrix相同的内存位置,当该内存更新时,更改也将反映到matrix指向的位置。

10-07 22:11