Года полтора назад работал над одним проектом. Развернут он был на AWS. Сервис на Java работал с БД DynamoDB (NoSQL). В какой-то момент в логах посыпались ошибки, что приложение не может сохранить данные в БД из-за дублирования ключа. Я был удивлен, поскольку в коде для работы с данными использовал HashSet, и был уверен, что дубликаты не могут существовать. Оказалось - еще как могут. Если при работе, например, со строками HashSet хранит данные как положено, то при работе с объектами ситуация совсем другая. Мы вполне законно можем закинуть объект в HashSet и после этого дальше использовать и модифицировать его в коде. Из-за чего наш объект, находящийся в HashSet, так же меняется. Это связано с тем, что в HashSet хранятся ссылки на объекты, а не сами объекты. Таким образом, два разных с точки зрения места в памяти объекта могут быть совершенно одинаковыми по своему наполнению. Для примера возьмем класс Dog, который имеет два поля - имя и возраст: А теперь добавим в HashSet два объекта к