Ответ
Метод 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).