Когда вы создаете свои собственные объекты и планируете использовать их в коллекции, вы всегда должны переопределять следующие методы:
boolean equals(Object o);
int hashCode();
Реализация по умолчанию равна проверяет, указывают ли объекты на один и тот же объект,в то время как вы, вероятно, захотите переопределить его, чтобы проверить содержимое.
Насколько это практически целесообразно, метод hashCode, определенный классом Object, возвращает разные целые числа для разных объектов.Для соблюдения правил hashCode объекта, равного другому, должен быть таким же, поэтому вам также следует переопределить hashCode.
EDIT : я ожидал ошибочный hashCode
илиequals
реализации, но с момента вашего ответа вы обнаружили, что изменяете ключи после их добавления в HashSet или HashMap.
Когда вы добавляете Object в коллекцию хешей, его hashCode вычисляется ииспользуется для сопоставления его с физическим местоположением в Коллекции.
Если некоторые поля, используемые для вычисления hashCode, будут изменены, сам hashCode изменится, поэтому реализация HashSet будет сбита с толку.Когда он пытается получить Объект, он смотрит на другое физическое местоположение и не находит Объект.Объект все равно будет присутствовать, если вы перечислите набор.
По этой причине всегда делайте ключи HashMap или HashSet Неизменные .