В классе Object методы hashCode() и equals() имеют базовую реализацию:
hashCode(): Обычно возвращает целое число, представляющее внутренний адрес объекта в памяти (или значение, производное от него). Это гарантирует, что разные объекты, по крайней мере в большинстве случаев, будут иметь разные хеш-коды.java
equals(): Сравнивает два объекта по ссылке (this == obj). Это означает, что метод возвращает true только если обе переменные ссылаются на один и тот же объект в памяти.java
Эти базовые реализации являются фундаментом и должны быть переопределены в классах-наследниках, если требуется сравнение объектов по их содержимому (т.е. проверка на логическое равенство), а не только по ссылке. При переопределении equals() обязательно нужно переопределять и hashCode() так, чтобы соблюдалось правило: если два объекта равны согласно equals(), то их хеш-коды, возвращаемые hashCode(), должны быть одинаковыми. Обратное утверждение неверно (разные объекты могут иметь одинаковые хеш-коды).