HashSet не распознаёт одинаковые объекты User

Переопределите equals и hashCode по name, а поле сделайте неизменяемым. Тогда HashSet сможет считать два разных объекта с одинаковым именем равными.

Короткий ответ

Что ответить на собеседовании

Переопределите 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 могло бы сделать объект недоступным для корректного поиска.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее