Вы не перекрыли equals()
и hashcode()
.HashSet проверяет, равен ли объект другому, на основе метода equals.Кроме того, чтобы не проводить много сравнений, он группирует объекты с одинаковым хеш-кодом.
Обратите внимание, что обычно необходимо переопределять метод hashCode всякий раз, когда этот метод переопределяется, чтобы поддерживать общий контракт дляметод hashCode, который утверждает, что равные объекты должны иметь одинаковые хеш-коды.
Сгенерированная версия equals и хеш-код:
public class A{
private int elem;
public A(int elem) {
this.elem = elem;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
A a = (A) o;
return elem == a.elem;
}
@Override
public int hashCode() {
return Objects.hash(elem);
}
}