Arti-Jack
@Arti-Jack

Почему hashset добавляет одинаковые объекты?

Имеется такой код.
class Point {
    int x, y;
    public Point(int x, int y) {
        super();
        this.x = x;
        this.y = y;

    }

    @Override
    public int hashCode() {
        final int prime = 31;
        return prime + prime * x + prime * prime * y;
    }

}

public class Test {
    public static void main(String[] args) {
        HashSet<Point> set = new HashSet<Point>();
        set.add(new Point(12, 13));
        set.add(new Point(9, 0));
        set.add(new Point(12, 13));
        set.add(new Point(9, 30));
        System.out.println(set.size());
    }

}


Вопрос:
Заданная программа выведет на экран число ...
.

Ответ почему-то 4, но ведь по идеи должно быть 3, разве не так?

Ведь два объекта Point абсолютно одинаковые по вычислению хэша (return prime + prime * x + prime * prime * y;) - я про те, у которых x и у равны 12 и 13 соответственно.
  • Вопрос задан
  • 1500 просмотров
Пригласить эксперта
Ответы на вопрос 1
@odissey_nemo
Программист, ГИС-системы, растры, космоснимки
Переписывать нужно методы hashСode и equals вместе.
Получилось так, что equals, вызываемый при обнаружении равенства hasСode, унаследован от Object. А он там сравнивает объекты по их адресу в памяти. Которые, для разных объектов, само собой, разные. Поэтому Ваш HashSet и считает что ВСЕ новые объекты, какой бы ни был у них hashcode, будут разными!

Просто перепишите и equals, чтобы он сравнивал между собой соответствующие друг другу поля класса у разных его экземпляров. И при их равенстве HashSet отвергнет второй объект, у которого тот же hashCode и те же значения полей.

Больше про эти дела, например тут.

И вообще это очень полезное и железное правило: одновременно менять (или проверять работоспособность этой сладкой парочки) hashCode и equals.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы