Как сравнить два списка
Короткий ответ
equals() у списков сравнивает элементы по порядку:
void main() {
var a = List.of(1, 2, 3);
var b = new ArrayList<>(List.of(1, 2, 3));
var c = List.of(3, 2, 1);
IO.println(a.equals(b));
IO.println(a.equals(c));
}Результат:
true
falseТип списка не важен: List.of() и ArrayList с одинаковыми элементами равны.
Без учёта порядка
Отсортируйте копии и сравните их:
void main() {
var a = List.of("b", "a", "c");
var b = List.of("c", "b", "a");
IO.println(a.stream().sorted().toList().equals(b.stream().sorted().toList()));
}Результат:
trueКак множества
Если повторы не важны, сравните множества:
void main() {
var a = List.of(1, 1, 2);
var b = List.of(2, 1);
IO.println(new HashSet<>(a).equals(new HashSet<>(b)));
}Результат:
trueЧастая ошибка
Сравнивать списки через == или проверять «одинаковость» через containsAll(). == сравнивает ссылки, а containsAll() не учитывает количество повторов:
void main() {
var a = List.of(1, 1, 1);
var b = List.of(1, 2);
IO.println(a == List.of(1, 1, 1));
IO.println(b.containsAll(a));
}Результат:
false
trueФункции из этого ответа
- Object.equals() — Сравнивает объекты по смыслу. По умолчанию работает как ==, поэтому в своих классах его переопределяют.
- HashSet — Множество без повторов на основе хеш-таблицы; порядок не гарантирован.
- List.contains() — Проверяет, есть ли элемент в списке.