ArrayList. Не могу понять как работает
Всем привет. У меня такая проблема: Я решаю задачу лабиринт(лабиринт - это матрица), и мне нужен лист всех ходов(ход это координаты в матрице);
Пример кода:
ArrayList<int[]> moves = new ArrayList<int[]>();
int[] pos = {0 , 0};
moves.add(pos);
System.out.println(moves.get(0)[0]+"-"+moves.get(0)[1]);
pos[0] = 1;
moves.add(pos);
System.out.println((moves.get(0))[0]+"-"+(moves.get(0))[1]);
pos[1] = 1;
moves.add(pos);
System.out.println(moves.get(0)[0]+"-"+moves.get(0)[1]);
Вывод: 0-0 1-0 1-1
В чем заключается вопрос:
Когда я использую add(), то pos должен добавляться в конец листа, но у меня все элементы листа меняются. Лист должен был 0-0 1-0 1-1 а у меня он 1-1 1-1 1-1
Ответы (1 шт):
В отличие от многих других языков, в Java массивы - это объекты (они и создаются оператором new), а переменные этого типа - это лишь ссылка на такой объект.
В вашем примере объект (массив) создаётся ровно один раз, когда выполняется {0 , 0} (new здесь неявное);
Все остальные присваивания копируют только ссылку на этот объект. Не важно какую из этих ссылок вы будете использовать, они изменят содержимое одного и того же объекта-массива, а значит, значения этого массива по другим ссылкам будут точно также изменены.
int[] a = new int[2]; // Создаём новый массив
a[0] = 10;
int[] b = a; // Копируем ссылку на тот же самый объект-массив
b[0] = 20;
System.out.println(a[0]); // 20 - изменился массив, не важно по какой ссылке мы его получаем
В вашем случае вам необходимо создавать новый массив перед каждым moves.add(pos);