Мой ArrayList очищается после того, как я вызываю явно не относящийся к делу метод

1

Это мой метод:

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

После того, как я вызываю "keepAll" -method, "this.coordinates" имеет в нем 0 элементов, тогда как раньше было 29.

Я подозреваю, что я, возможно, неправильно понял что-либо в объявлениях ArrayList или в файле preserveAll -method. Я не понимаю, почему "this.coordinates" опорожняется после того, как я вызываю "keepAll" -method.

Спасибо за помощь!

Теги:
arraylist

2 ответа

1
Лучший ответ

Ваш код не копирует список, а просто ссылается на оригинал. Чтобы скопировать, используйте метод addAll для testCoordinates (или соответствующего конструктора) вместо того, чтобы назначать его this.coordinates

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

Эта строка не создает копию ArrayList.

testCoordinates = this.coordinates;

Он назначает testCoordinates ссылаться на тот же объект, на который ссылается this.coordinates. У вас есть две переменные, относящиеся к одному и тому же объекту, поэтому операции по любой ссылке влияют на один и тот же объект. Таким образом, опуская ArrayList через retainAll влияет только на объект ArrayList, и изменения видны через обе ссылки на него.

Чтобы сделать копию, вы должны создать новый объект. Замените это:

testCoordinates = this.coordinates;

с этим:

testCoordinates = new ArrayList<int[]>(this.coordinates);
  • 0
    Спасибо! Я только что узнал что-то новое.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню