Почему мой класс не работает должным образом в Java HashSet? - PullRequest
0 голосов
/ 01 декабря 2009

Я работаю над проектом, в котором я использую HashSet класса, который я создал, который я назову Test. Я определил заявленное HashSet так:

HashSet<Test> t = new HashSet<Test>();
t.add(new Test("asdf", 1));
t.add(new Test("hello", 2));
t.add(new Test("hello", 3));

Я пытался использовать

t.contains(new Test("asdf", 1));

но возвращается false. Тем не менее, когда я использую HashSet<Character>, кажется, работает нормально. Я попытался переопределить предыдущее объявление equals, но оно не сработало. Я пытался оставить equals в покое, но я все еще получил false. Мне нужно знать, что я делаю не так?

также, я не редактировал хеш-функцию, я только изменил Test.equals (Object o). Это простой проект, и, поскольку в документации Java указано, что он использует o.equals (this), я подумал, что не должен был бы.

Ответы [ 4 ]

5 голосов
/ 01 декабря 2009

Возможно, вам также придется перегрузить метод hashCode ().

4 голосов
/ 01 декабря 2009

HashSet.add(Object data) не равно HashSet.add(new Test(String, int))

Попробуйте использовать HashSet.add(new Test("asdf", 1));. И сделать переопределения с помощью метода hashCode(). Ваш код компилируется?

3 голосов
/ 01 декабря 2009

Ваш код даже не скомпилируется ...

В HashSet нет метода add (), который принимает два аргумента.

Если вы имеете в виду

t.add(new Test("asdf", 1));

вместо

t.add("asdf", 1);

убедитесь, что хэш-код и метод equals класса Test реализованы правильно, как сказано выше.

2 голосов
/ 01 декабря 2009

Внутренне хеш-таблица будет использовать Object # hashCode () для хеширования и размещения ваших объектов, а Object # equals () для проверки на равенство, если есть столкновения hashCode. Вы должны убедиться, что ваш класс Test предоставляет подходящие реализации (переопределения), которые, в вашем случае, для проверки на равенство строк, в противном случае метод Object # equals () по умолчанию будет использовать идентификатор экземпляра объекта (ref id). См. здесь для учебника по этой теме.

...