Почему мой класс не работает должным образом в Java HashSet?
-
11-09-2019 - |
Вопрос
Я работаю над проектом, который предполагает, что я использую 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(объект o).Это простой проект, и поскольку в документации Java указано, что он использует o.equals (this), я подумал, что мне не придется этого делать.
Решение
Возможно, вам также придется перегрузить метод hashCode() .
Другие советы
HashSet.add(Object data)
не равнозначно HashSet.add(new Test(String, int))
Попробуйте использовать HashSet.add(new Test("asdf", 1));
.И сделайте переопределения из hashCode()
способ.Компилируется ли ваш код?
Ваш код даже не будет компилироваться...
HashSet не имеет метода add(), который принимает два аргумента.
Если ты имеешь в виду
t.add(new Test("asdf", 1));
вместо
t.add("asdf", 1);
убедитесь, что метод hashcode и equals тестового класса реализованы должным образом, как было сказано ранее.
Внутренне хэш-таблица будет использовать Object#hashCode(), чтобы хэшировать и объединять ваши объекты, и Object#equals() для проверки на равенство, если есть коллизии хэш-кодов.Вам необходимо убедиться, что ваш тестовый класс предоставляет подходящие реализации (переопределяет) их, в вашем случае для проверки на равенство строк, в противном случае метод Object#equals() по умолчанию будет использовать идентификатор экземпляра objects (идентификатор ссылки).Видишь здесь для получения руководства по этой теме.