Работа с Set: объект Ball, equals / hashCode

58. Проверить работу Set с equals и hashCode

Условие задачи:
Необходимо создать класс Ball с полями size и color.

Затем нужно:

  • создать четыре объекта Ball;

  • три объекта должны отличаться;

  • четвёртый должен совпадать с одним из созданных;

  • добавить все объекты в Set;

  • показать, что дубликат не был добавлен.

Код:

// Создать класс Ball(size, color)
// Создать 4 объекта Ball
// Добавить их в Set

Спойлеры к решению

Подсказки
💡 HashSet использует методы hashCode() и equals().
💡 Равные объекты должны возвращать одинаковый hashCode().
💡 Поля, участвующие в сравнении, лучше не изменять после добавления объекта в Set.
💡 Метод add() возвращает false, если равный элемент уже присутствует.

Решение
public class Main {

    public static void main(String[] args) {
        Ball first = new Ball(5, "red");
        Ball second = new Ball(6, "blue");
        Ball third = new Ball(7, "green");
        Ball duplicate = new Ball(5, "red");

        Set<Ball> balls = new HashSet<>();

        balls.add(first);
        balls.add(second);
        balls.add(third);

        boolean added = balls.add(duplicate);

        System.out.println("Дубликат добавлен: " + added);
        System.out.println("Количество мячей: " + balls.size());

        balls.forEach(System.out::println);
    }
}

final class Ball {

    private final int size;
    private final String color;

    public Ball(int size, String color) {
        this.size = size;
        this.color = color;
    }

    @Override
    public boolean equals(Object object) {
        if (this == object) {
            return true;
        }

        if (!(object instanceof Ball ball)) {
            return false;
        }

        return size == ball.size
                && Objects.equals(color, ball.color);
    }

    @Override
    public int hashCode() {
        return Objects.hash(size, color);
    }

    @Override
    public String toString() {
        return "Ball{"
                + "size=" + size
                + ", color='" + color + '\''
                + '}';
    }
}

Результат:

Дубликат добавлен: false
Количество мячей: 3

Объекты first и duplicate имеют одинаковые size и color, поэтому метод equals() считает их равными, а hashCode() возвращает для них одинаковое значение.

HashSet обнаруживает уже существующий элемент и не добавляет дубликат.