我很迷茫。
这是我对基本变量和赋值的理解:
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
指向的位置。