Java - TreeSet et hashCode()
J'ai une petite question sur le TreeSet
collections et hashCode
méthodes. J'ai un TreeSet
et je suis ajoutant des objets, avant que je ajouter un objet, je vérifie pour voir si il existe dans le TreeSet
à l'aide de la contient
méthode.
J'ai 2 objets distincts, dont chacun produire une nette hashCode à l'aide de ma mise en œuvre de la méthode hashCode, 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 hashCodes pour un run en particulier sont: 76126352 et 76126353 (les objets ne diffèrent que par la position d'un chiffre dans un attribut).
La méthode contains est de retourner true pour ces objets, même si les hashCodes sont différents. Des idées pourquoi? C'est vraiment déroutant et de l'aide serait vraiment appréciée.
OriginalL'auteur Gaz | 2009-09-24
Vous devez vous connecter pour publier un commentaire.
TreeSet ne pas utiliser
hashCode
à tous. Soit il utilisecompareTo
ou le Comparateur vous avez passé au constructeur. Il est utilisé par des méthodes telles que contient de trouver des objets dans le jeu.Donc la réponse à votre question est que votre méthode compareTo ou votre Comparateur sont définis de sorte que les deux objets en question sont considérées comme égales.
De la javadoc:
Pas selon les javadocs il ne le fait pas.
"C'est donc parce que l'Ensemble de l'interface est définie dans les termes de l'égale de l'opération, mais un TreeSet instance effectue tous les éléments de comparaisons à l'aide de son compareTo (ou de comparer les) méthode de ..." (à partir de java.sun.com/javase/6/docs/api/java/util/TreeSet.html)
voilà bien le problème, j'ai ajouté un attribut supplémentaire, mis à jour equals et hashCode mais oublié compareTo. Merci!!
que faire si je suis en insérant un objet Integer dans TreeSet et contient() retourne false, même si un nombre Entier avec la même valeur existe déjà dans le TreeSet?
OriginalL'auteur sepp2k
De Java Doc:
Signifie: les objets que vous utilisez pour le hachage ne sont pas égaux.
Ce est le " contrat général pour
hashCode()
'. C'est pourquoi il utilise le mot "doit".OriginalL'auteur tuergeist
Vous avez besoin de lire Joshua Bloch "Effective Java" au chapitre 3. Il explique les égaux contrat et comment remplacer égal à égal, hashCode, et compareTo.
J'étais tout prêt à upvote gustafc commentaire, mais le lien est rompu 🙁
Aller acheter le livre. Il est toujours là.
OriginalL'auteur duffymo
Vous n'avez pas besoin de vérifier si elle est contenue, parce que l'insert() se fait de la même opération (c'est à dire la recherche de la bonne position) sur son chemin vers le point d'insertion. Si l'objet ne peut pas être inséré (c'est à dire, l'objet est déjà contenue), insérer renvoie la valeur false.
OriginalL'auteur helpermethod