Ответ
Да, есть. Метод 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);
}
}