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 обнаруживает уже существующий элемент и не добавляет дубликат.