Правильно ли я предполагаю, что если у вас есть объект, содержащийся внутри набора Java <> (или как ключ на карте <>), любые поля, которые являются используемый для определения личности или отношения (через hashCode()
, equals()
, compareTo()
и т. д.) нельзя изменить, не вызывая неуказанного поведения для операций в коллекции? (Редактирование: как упомянуто в this other question)изменяемые поля для объектов в Java Set
(Другими словами, эти поля должны быть либо неизменное, или вы должны требовать объект, который будет удален из коллекции, а затем изменить, затем повторно.)
Я спрашиваю, что я читал Hibernate Annotations reference guide, и у него есть пример, где есть HashSet<Toy>
, но класс Toy
имеет поля name
и serial
, которые являются изменяемыми и также используются в расчете hashCode()
... красный флаг ушел в мою и я просто хотел убедиться, что я понял последствия этого.
Подождите, я просто понял, что это был очень плохой пример. Поскольку я все еще держал ссылку, последняя содержит() фактически возвращает true. HashMaps - это другое дело, но это почти уходит на трехдневный уик-энд, и я не хочу выкапывать пример. –
Хех, отправляй что-нибудь, когда вернешься - я с нетерпением жду этого. –
Подождите, я забыл, что HashSet использует HashMap в качестве поддержки. Это действительно может произойти: поддержка HashMap использует hashCode для перехода к ведру, прежде чем проверять equals() на элементах в ведре, а изменение элемента приведет к тому, что он перейдет в неправильное ведро и не найдет там никаких элементов. –