В каком классе Java объявлен метод `hashCode()` по умолчанию?

«В каком классе Java объявлен метод `hashCode()` по умолчанию?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Метод hashCode() объявлен в корневом классе java.lang.Object.

Назначение: Возвращает целочисленное хэш-значение объекта, используемое в хэш-таблицах (например, HashMap, HashSet).

Реализация по умолчанию: Обычно возвращает число, соответствующее внутреннему адресу объекта в памяти, но эта деталь не гарантирована спецификацией JVM.

// Пример вызова унаследованного метода
Object obj = new Object();
System.out.println(obj.hashCode()); // Работает, т.к. метод из класса Object

Контракт между equals() и hashCode():

  1. Если два объекта равны по equals(), их hashCode() должны быть одинаковыми.
  2. Если hashCode() объектов совпадает, это не гарантирует равенство по equals() (возможна коллизия).

Правило: Всегда переопределяйте hashCode(), когда переопределяете equals(). Используйте для расчета те же поля, что и в equals().

import java.util.Objects;

public class Person {
    private String name;
    private int id;

    @Override
    public int hashCode() {
        return Objects.hash(id, name); // Удобный метод из java.util.Objects
    }
}