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.

Foi útil?

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 .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top