在我调用一个看似无关紧要的方法后,我的ArrayList被清空了

时间:2015-03-25 17:21:41

标签: java arraylist

这是我的方法:

public boolean checkIfFriend(Coin coin){
    ArrayList <int []> testCoordinates = new ArrayList <int[]>();
    testCoordinates = this.coordinates; //I copy my ArrayList <Coin> "coordinates" into another ArrayList, "testCoordinates".
    testCoordinates.retainAll(coin.getCoordinates()); //I remove all elements from "testCoordinates" that do not exist in the ArrayList supplied as argument.
    if (testCoordinates.size() > 1){ //On this line, "this.coordinates" has been emptied for all elements. Why?
        return true;
    }
    return false;
}

在我调用“retainAll”方法后,“this.coordinates”中有0个元素,而之前有29个元素。

我怀疑我可能误解了有关ArrayList声明或retainAll方法的内容。在我称之为“retainAll”方法之后,我不明白为什么“this.coordinates”被清空了。

感谢您的帮助!

2 个答案:

答案 0 :(得分:5)

此行制作ArrayList

的副本
testCoordinates = this.coordinates;

它指定testCoordinates来引用this.coordinates引用的同一对象。有两个变量引用同一个对象,因此对任一引用的操作都会影响同一个对象。因此,清空ArrayList通过retainAll会影响唯一的ArrayList对象,并且通过对它的引用都可以看到更改。

要制作副本,您必须创建一个新对象。替换这个:

testCoordinates = this.coordinates;

用这个:

testCoordinates = new ArrayList<int[]>(this.coordinates);

答案 1 :(得分:1)

您的代码不会复制List,而只是引用原始代码。要复制,请将addAll方法用于testCoordinates(或相应的构造函数),而不是将其分配给this.coordinates

ArrayList <int []> testCoordinates = new ArrayList <int[]>(this.coordinates);
testCoordinates.retainAll(...);