Сколько объектов Dog будет в HashSet после добавления Dog(shepherd, Joe), Dog(sharik, «»), и Dog(shepherd, Henry) и почему

«Сколько объектов Dog будет в HashSet после добавления Dog(shepherd, Joe), Dog(sharik, «»), и Dog(shepherd, Henry) и почему» — вопрос из категории Java, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

class Dog {
    String breed;
    String name;

    Dog(String breed, String name) {
        this.breed = breed;
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Dog dog = (Dog) o;
        return Objects.equals(breed, dog.breed);
    }

    @Override
    public int hashCode() {
        return Objects.hash(breed);
    }
}

В HashSet останется 2 объекта:

  1. Dog("shepherd", "Joe") или Dog("shepherd", "Henry") (один из них, так как equals/hashCode сравнивают только breed)
  2. Dog("sharik", "") (уникальный breed)

HashSet использует equals() и hashCode() для определения уникальности. Так как у первых двух собак одинаковый breed "shepherd", второй объект перезапишет первый. Третья собака с breed "sharik" будет добавлена как уникальный элемент.