Для корректной работы коллекций и других механизмов, основанных на сравнении объектов (например, HashMap, HashSet), необходимо соблюдать следующие правила:
equals): Для любой ненулевой ссылки x, x.equals(x) должно возвращать true.equals): Для любых ненулевых ссылок x и y, x.equals(y) должно возвращать true только в том случае, если y.equals(x) возвращает true.equals): Для любых ненулевых ссылок x, y и z, если x.equals(y) возвращает true и y.equals(z) возвращает true, то x.equals(z) должно возвращать true.equals): Для любых ненулевых ссылок x и y, многократный вызов x.equals(y) должен последовательно возвращать true или последовательно возвращать false при условии, что никакая информация, используемая в сравнениях equals на объектах, не была модифицирована.equals и null: Для любой ненулевой ссылки x, x.equals(null) должно возвращать false.equals и hashCode: Если x.equals(y) возвращает true для любых двух ненулевых ссылок x и y, то вызов x.hashCode() должен возвращать то же значение, что и вызов y.hashCode().hashCode: Многократный вызов hashCode() для одного и того же объекта в течение выполнения приложения должен последовательно возвращать то же самое целочисленное значение, при условии, что никакая информация, используемая в сравнениях equals на объекте, не была модифицирована. (Необязательно возвращать одно и то же значение для разных запусков приложения).Вот пример реализации:
java