Содержит () метод в java.util.HashSet не ведет себя так, как я ожидал от него - PullRequest
0 голосов
/ 20 апреля 2011

Это метод java main ():



    public static void main(String[] args) {

        HashSet set = new HashSet();
        Mapper test = new Mapper("asd", 0);
        set.add(test);

        System.out.println(new Mapper("asd", 0).equals(test));
        System.out.println(set.contains(new Mapper("asd", 0)));

    }

и мой класс Mapper:

class Mapper {

String word;
Integer counter;

Mapper (String word, Integer counter) {

    this.word = word;
    this.counter = counter;

}

public boolean equals(Object o) {

    if ((o instanceof Mapper) && (((Mapper)o).word == this.word)) {

        return true;

    }

    return false;

}

}

и результат:

правда

1012 * ложь *

Из спецификаций HashSet, при этом методе я читал следующее: «Возвращает true, если этот набор содержит указанный элемент. Более формально, возвращает true, если и только если этот набор содержит такой элемент e, что (o == null? E = = null: o.equals (e)). "

Так, кто-нибудь может объяснить мне, где я не прав? Или ...?

Спасибо.

Ответы [ 2 ]

8 голосов
/ 20 апреля 2011

Вам необходимо реализовать правильную функцию hashCode().

public int hashCode() {
  // equal items should return the same hashcode
}

Утилиты Java java.util содержат множество классов, которые полагаются на хеширование. Разрешение переопределять equals() по своему усмотрению означает, что нужно также корректно переопределить hashCode() для соответствия.

Правильная реализация hashCode() будет возвращать один и тот же хеш для любых двух объектов, где equals() возвращает true. Связанные с хэшем функции проверяют равенство хэшей, прежде чем проверять, совпадают ли объекты (для разрешения коллизий хешей).

1 голос
/ 20 апреля 2011

Контракт hashCode говорит, что если два объекта равны, они должны иметь одинаковый хэш-код.Такие коллекции, как HashSet, предполагают, что это подтверждается. Реализации

Object equals и hashCode основаны на адресах (или идентификаторах объектов).Если вы переопределяете equals для сравнения содержимого, вы должны переопределить hashCode, чтобы создать хэш на основе содержимого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...