我是Java的新手,遇到了一个问题。我有一个3d ArrayList
,我将此ArrayList
的项目发送到修改它的方法。但这似乎改变了3d ArrayList
的其他项目。
所以我创建一个矩阵ArrayList<ArrayList<ArrayList<Integer>>>
并打印出每个项目。
for(int i =0; i<solutionsMatrix.size(); i++)
{
//System.out.println(i);
System.out.println(solutionsMatrix.get(i));
}
然后我将此3d ArrayList
发送到另一个方法。每个子矩阵(i)都被修改。但是当这样做时,矩阵(i)的修改也会改变其他(非i)矩阵。
private ArrayList<ArrayList<ArrayList<Integer>>> siftSolutions(ArrayList<ArrayList<ArrayList<Integer>>> solutionsMatrix)
{
for(int n=0; n<solutionsMatrix.size();n++){
//System.out.println(solutionsMatrix.get(n));
ArrayList<ArrayList<Integer>> currentMatrix = mirrorMatrix(solutionsMatrix.get(n));
System.out.println(currentMatrix);
}
问题在于打印出的矩阵(第二个代码块中的注释掉部分)与第一个代码块的打印输出矩阵不匹配。我摆弄了代码并确定方法mirrorMatrix
以某种方式改变了3d矩阵solutionsMatrix
。
public ArrayList<ArrayList<Integer>> mirrorMatrix(ArrayList<ArrayList<Integer>> unmirrored) {
//every value of ij needs to equal ji, thus simply transmit all non-zeros
ArrayList<ArrayList<Integer>> mirror = new ArrayList<ArrayList<Integer>>(unmirrored);
for (int i = 0; i < mirror.size(); i++) {
for (int j = 0; j < mirror.size(); j++) {
if (mirror.get(i).get(j) != 0) {
mirror.get(j).set(i, mirror.get(i).get(j));
}
}
}
return mirror;
}
我尝试在网上搜索答案,但我找不到解释(这可能只是因为我不知道正确的术语来描述我的问题)。我希望有人可以向我解释为什么会这样,所以我可以解决这个问题并在将来避免它。
答案 0 :(得分:1)
ArrayList<ArrayList<Integer>> mirror = new ArrayList<ArrayList<Integer>>(unmirrored);
此行不会对其中的所有元素进行深层复制。它确实创建了ArrayList
的新实例,但其所有元素都与ArrayList<Integer>
实例中的unmirrored
实例相同。
因此,使用mirror.get(j).set(i, mirror.get(i).get(j));
更改这些元素确实会更改同一个实例mirror.get(j)
和unmirrored.get(j)
。即,mirror.get(j) == unmirrored.get(j)
。