Java-TreeSet y hashCode()
(4)
Debe leer el capítulo 3 de "Eficaz Java" de Joshua Bloch. Explica el contrato de iguales y cómo anular correctamente los iguales, hashCode y compareTo.
Tengo una pregunta rápida sobre TreeSet
colecciones hashCode
y los métodos hashCode
. Tengo un TreeSet
y le estoy agregando objetos, antes de agregar un objeto, TreeSet
si existe en el TreeSet
usando el método de contenido.
Tengo 2 objetos distintos, cada uno de los cuales produce un código hash distinto usando mi implementación del método hashCode, ejemplo a continuación:
public int hashCode()
{
int hash = 7;
hash = hash * 31 + anAttribute.hashCode();
hash = hash * 31 + anotherAttribute.hashCode();
hash = hash * 31 + yetAnotherAttribute.hashCode();
return hash;
}
Los códigos hash para una ejecución particular son: 76126352 y 76126353 (los objetos solo difieren en un dígito en un atributo).
El método de contenidos se está volviendo verdadero para estos objetos, aunque los códigos hash son diferentes. ¿Alguna idea de por qué? Esto es realmente confuso y la ayuda realmente sería apreciada.
Desde Java Doc:
Si dos objetos son iguales según el método equals (Objeto), entonces llamar al método hashCode en cada uno de los dos objetos debe producir el mismo resultado entero.
Medios: los objetos que utiliza para el hashing no son iguales.
No es necesario verificar si está contenido, porque el inserto () básicamente realiza la misma operación (es decir, busca la posición correcta) en su camino hacia el punto de inserción. Si el objeto no se puede insertar (es decir, el objeto ya está contenido), insert devuelve false.
TreeSet no usa hashCode
en absoluto. Utiliza compareTo
o el Comparador que pasaste al constructor. Esto es usado por los métodos como lo contiene para encontrar objetos en el conjunto.
Entonces, la respuesta a su pregunta es que su método compareTo o su Comparator están definidos de modo que los dos objetos en cuestión sean considerados iguales.
De los javadocs:
una instancia de TreeSet realiza todas las comparaciones de elementos utilizando su método compareTo (o compare), por lo que dos elementos que se consideran iguales por este método son, desde el punto de vista del conjunto, iguales.