Sobes.tech
Назад к вопросам
Junior — Middle
64

Что произойдет при вызове метода hashCode для объекта, если этот метод не был явно переопределен в классе?

Компании, где спрашивали
ДзенДзен

Ответ от нейросети

sobes.tech AI

Если в классе не переопределен метод hashCode(), то будет вызван метод hashCode() из класса Object.

По умолчанию Object.hashCode() возвращает целочисленное значение, которое обычно основано на внутреннем адресе объекта в памяти или другом уникальном идентификаторе, предоставляемом JVM.

Это означает, что:

  • Для разных экземпляров объекта, даже если они логически равны, будут разные хэш-коды.
  • Если вы переопределяете метод equals(), рекомендуется также переопределять hashCode(), чтобы обеспечить корректную работу коллекций, таких как HashMap или HashSet.

Пример:

class Person {
    String name;
    // equals переопределен, но hashCode нет
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Person)) return false;
        Person p = (Person) o;
        return name.equals(p.name);
    }
}

Person p1 = new Person();
p1.name = "Alice";
Person p2 = new Person();
p2.name = "Alice";

System.out.println(p1.equals(p2)); // true
System.out.println(p1.hashCode() == p2.hashCode()); // false, если hashCode не переопределен

Таким образом, без переопределения hashCode() объекты с одинаковыми данными могут иметь разные хэш-коды, что может привести к ошибкам при использовании в хэш-структурах.