Есть ли у всех объектов в Java метод hashCode?

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

Ответ

Да, есть. Метод hashCode() объявлен в классе Object, который является суперклассом для всех объектов в Java.

Важные детали:

  • Реализация по умолчанию (например, Object::hashCode) может не зависеть от состояния объекта и часто возвращает преобразованный адрес в памяти, но это зависит от JVM.
  • Контракт с equals(): При переопределении equals() обязательно нужно переопределять hashCode(), чтобы выполнялось правило: если a.equals(b) == true, то a.hashCode() == b.hashCode(). Нарушение этого контракта приведет к некорректной работе коллекций, основанных на хэше (HashMap, HashSet).

Пример корректного переопределения:

import java.util.Objects;

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

    @Override
    public int hashCode() {
        // Метод Objects.hash() генерирует хэш на основе переданных полей
        return Objects.hash(name, age);
    }
}