Что вернёт сравнение двух объектов с одинаковыми данными через equals(), если этот метод не переопределён?

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

Ответ

Метод equals() вернёт false, так как используется реализация по умолчанию из класса Object, которая сравнивает ссылки (адреса в памяти), а не содержимое объектов.

Пример, демонстрирующий проблему:

class Person {
    private String name;
    public Person(String name) { this.name = name; }
    // Методы equals() и hashCode() НЕ переопределены
}

Person p1 = new Person("Alice");
Person p2 = new Person("Alice"); // Создаётся новый объект с теми же данными

System.out.println(p1.equals(p2)); // false — сравниваются ссылки p1 и p2
System.out.println(p1 == p2);      // false — наглядно показывает разницу ссылок

Почему это важно и к каким последствиям приводит:

  1. Некорректная работа коллекций — HashSet, HashMap и другие используют equals() и hashCode(). Без их переопределения два логически одинаковых объекта будут считаться разными.
  2. Нарушение контракта — ожидаемое поведение equals() — сравнение по значению. Его отсутствие вводит в заблуждение.

Решение: Всегда переопределяйте equals() (и hashCode() для согласованности) для классов-значений.

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Person person = (Person) o;
    return Objects.equals(name, person.name); // Сравнение по полям
}