La compréhension contient méthode de Java HashSet
Newbie question à propos de java HashSet
Set<User> s = new HashSet<User>();
User u = new User();
u.setName("name1");
s.add(u);
u.setName("name3");
System.out.println(s.contains(u));
Quelqu'un peut m'expliquer pourquoi ce code de sortie faux ? En outre, ce code ne fait même pas appel de méthode equals de l'Utilisateur. Mais selon les sources de HashSet et HashMap il faut l'appeler. La méthode equals de l'Utilisateur appelle simplement égale nom de l'utilisateur. La méthode hashCode retour hashCode de nom de l'utilisateur
Avez-vous mettre en œuvre
Pour citer Jon Skeet "des Objets dans hashsets devrait être immuable, ou vous avez besoin de faire preuve de discipline dans pas de les changer après qu'ils ont été utilisés dans un hashset (ou table de hachage)." - stackoverflow.com/questions/4718009/...
User.equals()
méthode?Pour citer Jon Skeet "des Objets dans hashsets devrait être immuable, ou vous avez besoin de faire preuve de discipline dans pas de les changer après qu'ils ont été utilisés dans un hashset (ou table de hachage)." - stackoverflow.com/questions/4718009/...
OriginalL'auteur user12384512 | 2011-08-11
Vous devez vous connecter pour publier un commentaire.
Si le code de hachage méthode est basée sur la
name
champ, et vous ensuite de le modifier après l'ajout de l'objet, puis la deuxièmecontains
vérification de l'utilisation de la nouvelle valeur de hachage, et de ne pas trouver l'objet que vous recherchez. C'est parce queHashSet
s première recherche par code de hachage, de sorte qu'ils ne sont pas la peine d'appelerequals
si cette recherche échoue.Le seul moyen ce serait le travail est si vous n'avais pas substituée
equals
(et donc la valeur par défaut référence d'égalité a été utilisé) et tu as de la chance, et les codes de hachage des deux objets sont égaux. Mais c'est un vraiment scénario improbable, et vous ne devriez pas compter sur elle.En général, vous devriez jamais mise à jour d'un objet après l'avoir ajouté à un
HashSet
si ce changement va aussi changer son hashcode.OriginalL'auteur dlev
Depuis votre nouveau
User
a un autre hashcode, le HashSet sait qu'elle n'est pas égale.HashSets stocker leurs articles en fonction de leur hashcodes.
Le HashSet auront
equals
si il trouve un élément avec le même hashcode, afin de s'assurer que les deux éléments sont en fait égaux (par opposition à une collision de hachage)Correct. En général, c'est une mauvaise idée de mettre mutable objets dans un HashSet. Si vous faites
hashCode()
retour0
, vous perdez tous les avantages de performance de la HashSet, et vous vous retrouverez avec le plus lent de la collecte, vous pouvez éventuellement obtenir.Je sais, c'est juste un exemple
Je crois que ce devrait être la accepté de répondre. Il est intéressant de noter que la javadoc de
HashSet.contains()
ne rien dire à ce sujet équivaut à être appliqué seulement après le vérifier hashcode.OriginalL'auteur SLaks