Newbie question about 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));
Can someone explain why this code output false? Moreover this code does not even call the equals
method of the User
class.
But according with the sources of HashSet
and HashMap
they have to call it. The equals
method of the User
simply calls equals on user's name. The hashCode
method returns the hashcode of the user's name.
If the hash code method is based on the name
field, and you then change it after adding the object, then the second contains
check will use the new hash value, and won't find the object you were looking for. This is because HashSet
s first search by hash code, so they won't bother calling equals
if that search fails.
The only way this would work is if you hadn't overridden equals
(and so the default reference equality was used) and you got lucky and the hash codes of the two objects were equal. But this is a really unlikely scenario, and you shouldn't rely on it.
In general, you should never update an object after you have added it to a HashSet
if that change will also change its hashcode.