¿Por qué mi clase no funciona correctamente en un HashSet Java?
-
11-09-2019 - |
Pregunta
Estoy trabajando en un proyecto que me implica el uso de un HashSet
de una clase que hice, lo que voy a nombrar Test
. He definido el indiqué HashSet
este modo:
HashSet<Test> t = new HashSet<Test>();
t.add(new Test("asdf", 1));
t.add(new Test("hello", 2));
t.add(new Test("hello", 3));
He intentado utilizar
t.contains(new Test("asdf", 1));
false
pero vuelve. Sin embargo, cuando se utiliza un HashSet<Character>
que parece funcionar bien. He intentado anular la declaración equals
anterior, pero no funcionó. Traté de salir equals
solo, pero yo todavía tengo false
. Necesito saber lo que estoy haciendo mal?
Además, yo no modificó la función hash, lo único que ha cambiado Test.equals (Object o). Es un proyecto simple y dado que la documentación de Java afirma que utiliza o.equals (este), pensé que no tendría que hacerlo.
Solución
Es posible que tenga sobrecargar el método hashCode () también.
Otros consejos
HashSet.add(Object data)
no es igual a HashSet.add(new Test(String, int))
Trate de usar HashSet.add(new Test("asdf", 1));
. Y hacer las anulaciones del método hashCode()
. Se compila el código?
Su código ni siquiera compilará ...
HashSet no tiene un método Add () que acepta dos argumentos.
Si se refiere a
t.add(new Test("asdf", 1));
en lugar de
t.add("asdf", 1);
asegurarse de que el código hash y es igual método de la clase de prueba se aplica adecuadamente, como se dijo antes.
internamente una tabla hash utilizará Object # hashCode (), para discutir y un cubo de sus objetos y objeto # iguales () para comprobar la igualdad si hay enfrentamientos hashCode. Usted necesita asegurarse de que su clase de prueba proporciona implementaciones adecuadas (overrrides) estos, en su caso para comprobar la igualdad de cuerdas, de lo contrario los predeterminado objeto # método equals () utilizará la identidad ejemplo objetos (ref id). Ver aquí para un tutorial sobre este tema .