Я думаю, вам нужно, чтобы hashCode довольно часто зависел от изменяемых полей: когда вы переопределяете equals, это зависит от изменяемых полей.
Из контракта hashCode: «Если два объекта равны в соответствии с методом equals (Object), то вызов метода hashCode для каждого из двух объектов должен давать один и тот же целочисленный результат.»
Итак, если вы создаете два объекта, таких как A.equals (B), истинно, а затем модифицируете A таким образом, что A.equals (B) становится ложным, вам также нужно изменить hashCodes.
Это правда, что в документации hashCode указано, что «Не требуется, чтобы, если два объекта были неравны в соответствии с методом equals (java.lang.Object), то вызов метода hashCode для каждого из двух объектов должен привести к целочисленные результаты. ", но я не знаю, как это может помочь.