Ответ
Логическая эквивалентность (равенство по содержимому) объектов в Java определяется методом equals(). По умолчанию (в классе Object) он сравнивает ссылки (==). Чтобы сравнить состояние объектов, метод необходимо переопределить.
Ключевые правила при переопределении equals():
- Рефлексивность:
x.equals(x)— всегдаtrue. - Симметричность: если
x.equals(y) == true, то иy.equals(x) == true. - Транзитивность: если
x.equals(y)иy.equals(z), тоx.equals(z). - Согласованность: многократный вызов
equals()с неизменными объектами должен возвращать одинаковый результат. - Сравнение с
null:x.equals(null)— всегдаfalse.
Связь с hashCode(): При переопределении equals() обязательно переопределите hashCode(), чтобы соблюсти контракт: равные объекты должны иметь равные хеш-коды.
Пример корректной реализации для класса Person:
public class Person {
private String name;
private int age;
@Override
public boolean equals(Object o) {
// 1. Проверка ссылки
if (this == o) return true;
// 2. Проверка типа и null
if (o == null || getClass() != o.getClass()) return false;
// 3. Приведение типа и сравнение полей
Person person = (Person) o;
return age == person.age && Objects.equals(name, person.name);
}
@Override
public int hashCode() {
// Используем готовый метод для консистентности
return Objects.hash(name, age);
}
}