В каком классе Java объявлен метод `equals()` по умолчанию?

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

Ответ

Метод equals() объявлен в корневом классе java.lang.Object. Все классы в Java неявно наследуются от Object, поэтому получают его реализацию.

Реализация по умолчанию в Object:

public boolean equals(Object obj) {
    return (this == obj); // Сравнивает ссылки (адреса в памяти), а не содержимое объектов.
}

Зачем переопределять equals()? Для сравнения объектов по их логическому состоянию (значениям полей), а не по ссылкам.

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

public class Person {
    private String name;
    private int id;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true; // Проверка на один и тот же объект
        if (o == null || getClass() != o.getClass()) return false; // Проверка типа
        Person person = (Person) o; // Приведение типа
        return id == person.id && Objects.equals(name, person.name); // Логическое сравнение полей
    }
}

Важно: При переопределении equals() всегда переопределяйте hashCode() для корректной работы с коллекциями, основанными на хэше (HashMap, HashSet).