Переопределите equals и hashCode по name, а поле сделайте неизменяемым. Тогда HashSet сможет считать два разных объекта с одинаковым именем равными.
HashSet не распознаёт одинаковые объекты User
Переопределите equals и hashCode по name, а поле сделайте неизменяемым. Тогда HashSet сможет считать два разных объекта с одинаковым именем равными.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В классе User объявлено единственное поле name. При добавлении в HashSet двух экземпляров User с одинаковым значением name оба объекта оказываются в наборе. Нужно исправить ситуацию, чтобы HashSet воспринимал такие объекты как одинаковые и хранил в коллекции только один элемент для каждого уникального имени.
public class User {
private String name;
public User(String name) {
this.name = name;
}
}
Ответ
Переопределите equals и hashCode по name, а поле сделайте неизменяемым. Тогда HashSet сможет считать два разных объекта с одинаковым именем равными.
public final class User {
private final String name;
public User(String name) { this.name = name; }
@Override
public boolean equals(Object other) {
if (this == other) return true;
if (!(other instanceof User)) return false;
return java.util.Objects.equals(name, ((User) other).name);
}
@Override
public int hashCode() {
return java.util.Objects.hashCode(name);
}
}
Null здесь допустим и равен другому null. Правило чувствительно к регистру и пробелам; нормализация требует отдельного решения. Изменение name после добавления в HashSet могло бы сделать объект недоступным для корректного поиска.