我正在创建一个临时变量 "temp",这样我就不会更改实际设置值,但它仍在对原始设置进行更改。为什么?

I am creating a temporary variable "temp" so that I don't change the actual set value but it still is making changes in the original set. WHY?

我有一个名为“set”的 HashSet 数组列表,为了对单个 HashSet 进行操作,我正在将 Set 的值复制到临时 HashSet“temp”,但是当我通过命令“temp.retainAll(set.get(i))" 它改变了原来的设置...请帮助我。代码如下:

public class newques { 
public boolean ValidCorner(int matrix[][]) 
{ 
    // Your code goes here
    boolean result = false;
    int r = matrix.length;
    int c = matrix[0].length;
    ArrayList<HashSet<Integer>> set = new ArrayList<>();
    for (int i = 0; i < r; i++) {
        HashSet<Integer> temp = new HashSet<>();
        for (int j = 0; j < c; j++) {
            if (matrix[i][j]==1) {
                temp.add(j);
            }
        }
        set.add(temp);
    }

    System.out.println(set);
    System.out.println("Size of set is: " + set.size());

    for (int i = 0; i < set.size(); i++) {
        for (int j = i+1; j < set.size(); j++) {
            HashSet<Integer> temp = set.get(i);
            System.out.println(temp);
            System.out.println(set.get(j));
            temp.retainAll(set.get(j));
            System.out.println(set.get(i));
            System.out.println("Temp set is: " + temp);
            System.out.println();
            if (temp.size() % 2 == 0 && temp.size() != 0) {
                result = true;
                break;
            }
        }
    }
    return result;
}

}

此指令 HashSet<Integer> temp = set.get(i); 使您访问位于 set 位置“内部”的同一集合 i。这就是它修改的原因。

您必须创建一个新集合

Set<Integer> temp = new HashSet<>(set.get(i));

这样两者都会指向不同的集合。

也许以下内容有助于更深入地理解这一点:Duplicating objects in Java