2

我对 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;
}

我曾尝试在网上搜索答案,但找不到解释(这可能只是因为我不知道正确的术语来很好地描述我的问题)。我希望有人可以向我解释为什么会发生这种情况,以便我可以解决问题并在将来避免它。

4

1 回答 1

1
ArrayList<ArrayList<Integer>> mirror = new ArrayList<ArrayList<Integer>>(unmirrored);

此行不会对其中的所有元素进行深度复制。它确实创建了 an 的新实例ArrayList,但它的所有元素都是实例中ArrayList<Integer>存在的 as的相同unmirrored实例。

因此,更改这些元素mirror.get(j).set(i, mirror.get(i).get(j));确实会更改相同的实例mirror.get(j)unmirrored.get(j). 即,mirror.get(j) == unmirrored.get(j)

于 2013-07-28T17:00:34.630 回答