Question

J'ai une petite question sur le TreeSet hashCode méthodes . J'ai un TreeSet et je suis d'ajouter des objets à elle, avant d'ajouter un objet, je vérifie pour voir si elle existe dans le TreeSet en utilisant le contains .

J'ai 2 objets distincts, qui produisent chacun un hashCode distinct en utilisant ma mise en œuvre de la méthode hashCode, par exemple ci-dessous:

public int hashCode()
{
    int hash = 7;
    hash = hash * 31 + anAttribute.hashCode();
    hash = hash * 31 + anotherAttribute.hashCode();
    hash = hash * 31 + yetAnotherAttribute.hashCode();
    return hash;
}

Les codes de hachage pour une exécution particulière sont: 76126352 et 76126353 (les objets ne diffèrent que par un chiffre dans un attribut)

.

La méthode contient retourne vrai pour ces objets, même si les hashcodes sont différents. Toutes les idées pourquoi? C'est vraiment déroutant et aide serait vraiment appréciée.

Était-ce utile?

La solution

TreeSet n'utilise pas du tout hashCode. Il utilise soit compareTo ou vous Comparator transmis au constructeur. Il est utilisé par des méthodes comme contient pour trouver des objets dans le jeu.

Donc, la réponse à votre question est que votre méthode compareTo ou votre Comparator sont définis de telle sorte que les deux objets en question sont considérés comme égaux.

De la javadoc:

  

une instance TreeSet exécute tous   Comparaisons des éléments à l'aide de son   Procédé compareTo (ou comparer), de sorte que deux   éléments qui sont considérés comme égaux par ce   Procédé sont, du point de vue de la   ensemble, égaux.

Autres conseils

De Java Doc:

  

Si deux objets sont égaux en fonction de la méthode equals (Object),       puis en appelant la méthode hashCode sur chacun des deux objets doivent       produire le même résultat entier.

Moyens:. Les objets que vous utilisez pour le hachage ne sont pas égaux

Vous devez lire le chapitre "Effective Java" de Joshua Bloch 3. Il explique le contrat equals et comment remplacer correctement égaux, hashCode et compareTo.

Vous ne devez pas vérifié si elle est contenue, parce que l'insert () fait essentiellement la même opération (à savoir la recherche de la bonne position) sur son chemin vers le point d'insertion. Si l'objet ne peut pas être inséré (à savoir, l'objet est déjà contenu), insérer retourne false.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top