Этот вопрос много раз отвечает в SO, но все же я попытаюсь ответить на это.
Для того, чтобы понять эту концепцию полностью, мы должны понимать цель хэш-код и составляет, как они реализуются, и что именно этот контракт (что хэш-код также должен быть переопределен при равных переопределяется)
equals метод используется для определения равенства объекта. Для примитивных типов очень легко определить равенство. Мы можем легко сказать, что int 1 всегда равен 1. Но этот равный метод говорит о равенстве объектов. Равенство объекта зависит от переменных экземпляра или любого другого параметра (зависит только от реализации - как вы хотите сравнить).
Этот равный метод необходимо переопределить, если мы хотим провести какое-то индивидуальное сравнение, скажем, мы хотим сказать, что две книги одинаковы, если они имеют одинаковый заголовок и тот же автор, или я могу сказать, что две книги равны, если они имеют одинаковые ISBN.
hashcode метод возвращает значение хэш-кода объекта. По умолчанию реализация hashcode объекта возвращает отдельные целые числа для отдельных объектов. Это целое число вычисляется на основе адреса памяти объекта.
Таким образом, мы можем сказать, что реализация метода equals по умолчанию просто компилирует хэш-коды для проверки равенства объекта. Но для примера книги - нам нужно это по-другому.
Также Равные объекты должны иметь одинаковый хэш-код, если они равны, однако неравномерные объекты не должны создавать четкие хэш-коды.
В случае не используя хэш на основе коллекции, вы можете разорвать контракт и не нужно переопределить метод Hashcode - потому что вы не будете использовать реализацию по умолчанию в любом месте, но все-таки я бы не предложить, что и хотел бы сказать иметь его, как вам может понадобиться в будущем, когда вы помещаете эти вещи в коллекцию
Поскольку любые два объекта, которые являются «равными», ДОЛЖНЫ, по определению, иметь один и тот же «хэш-код», как они могут быть «равными» в противном случае? – MadProgrammer
Потому что когда-нибудь вы * будете * пытаться набить его в хэш-сбор, даже если только косвенно. Это скрытая ошибка, которую легко избежать. – chrylis
Потому что кто-то еще может. Или вы, в будущем. Это эквивалентно наличию 'int subtract (a, b) {return a + b; } 'в вашем коде. Вы можете вспомнить это сейчас, но если ваш код станет больше или получит нового разработчика ... Ой. Если вы не сожжете его, это только к счастью. – Amadan