Java : почему пишет false?

Результат должен быть true, в чем ошибка?

List<Integer[]> blocks = new ArrayList<>();
for(int r = 0; r < 64; r++) {
    
    Integer block[] = {1,2};
    blocks.add(block);
    
}
Integer[] xy1 = {1,2};
System.out.println(blocks.contains(xy1));


Ответы (1 шт):

Автор решения: insolor

Потому что равенство массивов (в отличие от равенства списков) проверяется по внутреннему id объекта (условно - по его адресу в памяти), как при сравнении объектов через ==, а не equals.

Чтобы массивы были равны, они должны быть одним и тем же массивом. У вас массивы созданные в цикле - это не тот же самый массив, наличие которого вы проверяете, поэтому contains и не находит его.

Если бы у вас был список списков, то все бы работало, т.к. равенство списков проверяется по равенству их элементов.

Вносим минимальные изменения в код, и все волшебным образом начинает работать:

List<List<Integer>> blocks = new ArrayList<>();
for(int r = 0; r < 64; r++) {
    
    List<Integer> block = List.of(1,2)
    blocks.add(block);
    
}
List<Integer> xy1 = List.of(1,2);
System.out.println(blocks.contains(xy1));
→ Ссылка