这是我的方法:
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”被清空了。
感谢您的帮助!
答案 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(...);