Por que a minha classe não funcionar corretamente em um Java HashSet?
-
11-09-2019 - |
Pergunta
Eu estou trabalhando em um projeto que me envolve o uso de um HashSet
de uma classe que eu fiz, o que eu vou citar Test
. I definiu a HashSet
declarado assim:
HashSet<Test> t = new HashSet<Test>();
t.add(new Test("asdf", 1));
t.add(new Test("hello", 2));
t.add(new Test("hello", 3));
Eu tentei usar
t.contains(new Test("asdf", 1));
mas ele retorna false
. No entanto, quando eu uso um HashSet<Character>
parece funcionar bem. Eu tentei substituir a declaração equals
anterior, mas não funcionou. Tentei sair equals
sozinho, mas eu ainda tenho false
. Eu preciso saber o que eu estou fazendo errado?
Além disso, eu não editar a função hash, eu só mudou Test.equals (Object o). É um projeto simples e uma vez que os estados documentação Java que usa o.equals (isso), eu pensei que eu não teria que.
Solução
Você pode ter que sobrecarregar o método hashCode () também.
Outras dicas
HashSet.add(Object data)
não é igual a HashSet.add(new Test(String, int))
Tente usar HashSet.add(new Test("asdf", 1));
. E fazer substituições a partir do método hashCode()
. A sua compilação de código?
O seu código não vai mesmo compilação ...
HashSet não tem um método add (), que aceita dois argumentos.
Se você quer dizer
t.add(new Test("asdf", 1));
em vez de
t.add("asdf", 1);
verifique se o hashcode e iguala método da classe de teste são implementados corretamente, como disse antes.
Internamente uma hashtable usará Objeto # hashCode (), a haxixe e balde de seus objetos, e objetos # equals () para teste de igualdade se houver confrontos hashCode. Você precisa se certificar que sua classe de teste fornece implementações adequadas (overrrides) estes, no seu caso para teste de igualdade corda, caso contrário, os iguais objeto default # () método irá usar a identidade instância (ref id) objetos. Consulte aqui para um tutorial sobre este tema .