Назад к вопросам
Middle
146
questionbank
Какие правила переопределения методов hashCode и equals в Java?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Для корректной работы коллекций и других механизмов, основанных на сравнении объектов (например, HashMap, HashSet), необходимо соблюдать следующие правила:
- Рефлексивность (
equals): Для любой ненулевой ссылкиx,x.equals(x)должно возвращатьtrue. - Симметричность (
equals): Для любых ненулевых ссылокxиy,x.equals(y)должно возвращатьtrueтолько в том случае, еслиy.equals(x)возвращаетtrue. - Транзитивность (
equals): Для любых ненулевых ссылокx,yиz, еслиx.equals(y)возвращаетtrueиy.equals(z)возвращаетtrue, тоx.equals(z)должно возвращатьtrue. - Согласованность (
equals): Для любых ненулевых ссылокxиy, многократный вызовx.equals(y)должен последовательно возвращатьtrueили последовательно возвращатьfalseпри условии, что никакая информация, используемая в сравненияхequalsна объектах, не была модифицирована. equalsиnull: Для любой ненулевой ссылкиx,x.equals(null)должно возвращатьfalse.- Согласованность между
equalsиhashCode: Еслиx.equals(y)возвращаетtrueдля любых двух ненулевых ссылокxиy, то вызовx.hashCode()должен возвращать то же значение, что и вызовy.hashCode(). - Согласованность
hashCode: Многократный вызовhashCode()для одного и того же объекта в течение выполнения приложения должен последовательно возвращать то же самое целочисленное значение, при условии, что никакая информация, используемая в сравненияхequalsна объекте, не была модифицирована. (Необязательно возвращать одно и то же значение для разных запусков приложения).
Вот пример реализации:
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public boolean equals(Object o) {
// Соблюдение правила null и рефлексивности
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
// Приведение типов
Person person = (Person) o;
// Сравнение значимых полей
return age == person.age &&
Objects.equals(name, person.name); // Используем Objects.equals для сравнения потенциально null строк
}
@Override
public int hashCode() {
// Генерация хэш-кода на основе значимых полей
return Objects.hash(name, age); // Используем Objects.hash для удобства и корректности
}
}