Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Как сравнить два списка

Короткий ответ

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() — Проверяет, есть ли элемент в списке.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.