HashSet contient des entrées en double
Un HashSet enregistre les valeurs, alors que la méthode equals dit qu'ils sont les mêmes. C'est ce que je pensais.
Mais maintenant, je suis en ajoutant des Éléments à un HashSet où la méthode equals renvoie true, et la taille de la pousse encore?? désolé, je suis confus. Quelques conseils où je me trompe, ce serait bien.
Element t1 = new Element(false, false, false, false);
Element t2 = new Element(true, true, true, true);
Element t3 = new Element(false, false, false, false);
if (t1.equals(t3))
System.out.println("they're equal");
Set<Element> set = new HashSet<>();
set.add(t1);
set.add(t2);
set.add(t3);
System.out.println("set size: " + set.size());
donc dans cet exemple de ma sortie de la console est:
qu'ils sont égaux
taille du jeu: 3
Qui n'a pas de sens pour moi.. ne faut la taille 2?
avait une petite faute de frappe. au lieu de t2.equals(t3) j'ai vérifié t1.equals(t3) et il est dit que t1 et t3 sont égaux selon leur méthode equals
lire ma réponse, vous devez également remplacer
Duplicate
lire ma réponse, vous devez également remplacer
hashCode
méthode.Duplicate
OriginalL'auteur tObi | 2013-04-26
Vous devez vous connecter pour publier un commentaire.
Le problème, c'est que votre
Element
classe n'a pas remplacé laequals
ethashCode
méthodes ou ces implémentations sont cassés.De
#égal à
méthode javadoc:De
#hashCode
méthode javadoc:Assurez-vous que les implémentations de ces méthodes de satisfaire à ces règles et votre
Set
(soutenu par unHashSet
) fonctionnera comme prévu.est égal à a été mis en œuvre pour assurer.
fonctionne avec
equals
ethashCode
méthodes. VotreElement
classe remplacer lehashCode
méthode ainsi afin de faire leSet
fonctionner comme prévu. Si cela n'est pas reflété dans ma réponse, veuillez rafraîchir la page.ok, donc ce pourrait être la réponse.. je vais l'essayer, merci. mais je suis un peu confus au sujet de la nécessité de la méthode hashCode becaus la doc de la jeux ajouter une méthode dit: Plus formellement, ajoute l'élément spécifié e pour cet ensemble si cet ensemble ne contient aucun élément e2 telle que (f==null ? e2==null : e.equals(e2)). (rien sur hashCode)
À moins d'ignorer
hashCode()
avecequals()
, vous violez les contrats de ces méthodes. Tout simplement parce que la Javadoc deHashSet#add()
doens pas référence àhashCode()
ne signifie pas que vous pouvez ignorer leequals()
ethashCode()
contrats.OriginalL'auteur Luiggi Mendoza
Vos objets différents hachages donc HashSet "met", puis dans différents "compartiments".
OriginalL'auteur Lazarus Lazaridis
Si vous avez votre propre modèle de classes que vous avez besoin de changer certaines fonctions de base de travail à effectuer dans l'exemple ci-dessous.
Exécution de code :
Classe De Modèle :
Espère que cette aide.
OriginalL'auteur Arun
Oui, Nous Pouvons mettre en œuvre avec l'objet de l'classes qui ne sont pas FINAL.
HashSet Vérifie pour les deux méthodes
hashCode()
etequals()
avant d'ajouter n'importe quel Objet.D'abord, il vérifie pour la méthode
hashCode()
,si elle renvoie le hashcode qui est même avec tout de l'objet dans le Jeu, puis il vérifie la méthode equals pour cet objet,qui en interne compare les références pour les deux objets que j'ai.ethis.obj1==obj
.Si ce sont les mêmes références dans ce cas, elle renvoie vrai signifie qu'il est une valeur en double.Nous pouvons ajouter de la double non-finale objets en substituant HashCode et equals méthode.
Dans HashCode() vous pouvez retourner même hashcode en cas de mêmes paramètres.
Voir l'exemple:
La sortie sera 1.
P. S:Sans écraser ces méthodes,la sortie est 3, car il sera utiliser leur comportement par défaut.
Certainement la solution a été donnée.J'ai juste dit à la logique de la manière dont les éléments sont comparés avant d'ajouter dans un Ensemble.Ainsi, Vous devez avoir à remplacer à la fois les méthodes pour créer un doublon. Si leur hashcode() retourne différents,il n'y a aucun moyen de remplacer equals().
OriginalL'auteur Shailesh Modi