Ответ
В Java эквивалентность объектов определяется семантическим равенством, а не ссылочным (==). Основу составляет контракт методов equals() и hashCode():
equals(Object o)— определяет логическое равенство объектов (например, равны ли их значимые поля).hashCode()— возвращает целочисленное значение, согласованное с методомequals().
Ключевой контракт:
- Если
a.equals(b)возвращаетtrue, тоa.hashCode()обязан быть равенb.hashCode(). - Обратное неверно: равные хеш-коды не гарантируют равенство объектов (возможны коллизии).
Пример корректной реализации:
public class Person {
private final String id;
private String name;
@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.equals(person.id); // Сравниваем по уникальному идентификатору
}
@Override
public int hashCode() {
return Objects.hash(id); // Хеш-код вычисляется по тем же полям, что и equals
}
}
Почему это важно? Нарушение этого контракта приводит к некорректной работе коллекций, основанных на хешах (HashMap, HashSet).