Прежде всего, когда вы переопределяете equals (), вы ДОЛЖНЫ также переопределять hashcode ().
Неспособность сделать это
приведет к нарушению общего контракта для Object.hashCode, который будет
препятствуйте тому, чтобы ваш класс функционировал должным образом в сочетании со всеми основанными на хэше
коллекции, включая HashMap, HashSet и Hashtable.
Вот контракт, скопированный из спецификации объекта [JavaSE6]:
- Всякий раз, когда он вызывается для одного и того же объекта более одного раза во время выполнения
приложения, метод hashCode должен последовательно возвращать
то же самое целое, при условии, что информация не используется в сравнениях на
объект изменен Это целое число не должно оставаться последовательным из одного
Направление приложения на другое исполнение того же приложения.
- Если два объекта равны по методу equals (Object), то вызов
Использование метода hashCode для каждого из двух объектов должно привести к
целочисленный результат.
- Не требуется, чтобы, если два объекта были неравны в соответствии с методом equals (Object), то вызывать метод hashCode для каждого из двух объектов
должен давать разные целочисленные результаты. Тем не менее, программист должен быть
осознавая, что получение различных целочисленных результатов для неравных объектов может улучшить
производительность хеш-таблиц.