Ваш набор на самом деле HashSet
.Категория не реализует hashCode
.В результате, когда вы собираетесь удалить объект, идентификатор объекта используется в качестве хеш-кода, и для каждого отдельного объекта, даже если он семантически эквивалентен, он в конечном итоге использует другой хеш-код, глядя в неправильном месте вхэш установлен и не найден соответствующий соответствующий объект.
Добавьте
@Override
public int hashCode() {
return id.hashCode();
}
к Category
и все должно быть в порядке.
Требование переопределить hashCode
можетчитать в JavaDoc для java.lang.Object # равно :
Обратите внимание, что обычно необходимо переопределить метод hashCode всякий раз, когда этот метод переопределяется, чтобы сохранитьобщий контракт для метода hashCode, в котором говорится, что равные объекты должны иметь равные хеш-коды.
Как следует из этого текста, JavaDoc для hashCode описывает это более подробно.
В то время как JavaDoc для remove
может быть более понятным по предмету, он ссылается только на equals
как часть спецификации, для которого объект будет удаленove - это не значит, что equals
- единственное, что он будет использовать.
Наконец, если вы используете Eclipse, вы можете включить предупреждение, которое предупредит вас, если вы переопределите equals
без переопределения hashCode
или наоборот.