Что произойдет, если использовать метод equals() без его переопределения?

«Что произойдет, если использовать метод equals() без его переопределения?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Можно, но это приведет к логической ошибке. Без переопределения используется реализация Object.equals(), которая сравнивает ссылки (как оператор ==), а не содержимое объектов.

Пример проблемного поведения:

class Person {
    String name;
    Person(String name) { this.name = name; }
    // equals() НЕ переопределен
}

Person p1 = new Person("Alice");
Person p2 = new Person("Alice");
System.out.println(p1.equals(p2)); // false! Объекты разные, хоть имена одинаковы
System.out.println(p1 == p2);      // false (то же самое сравнение)

Почему это важно? Коллекции, такие как HashMap, HashSet, и методы вроде List.contains() полагаются на equals() для корректной работы. Без переопределения два логически равных объекта будут считаться разными.

Правило: Если вы переопределяете equals(), вы должны также переопределить hashCode(), чтобы соблюдать контракт между этими методами (объекты, равные по equals(), должны иметь одинаковый hashCode()).