关于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));
有人可以解释为什么这段代码输出错误?而且这段代码甚至不调用User的equals方法。但根据HashSet和HashMap的来源,它必须调用它。方法等于用户只需在用户名上调用equals。方法hashCode返回用户名的hashCode
答案 0 :(得分:13)
如果哈希码方法基于name
字段,然后在添加对象后更改它,那么第二个contains
检查将使用新的哈希值,并且将无法找到你正在寻找的对象。这是因为HashSet
首先按哈希码搜索,因此如果搜索失败,他们就不会打扰调用equals
。
唯一可行的方法是,如果你没有覆盖equals
(因此使用默认的引用相等性)和你很幸运两个对象的哈希码是相等的。但这是真的不太可能的情况,你不应该依赖它。
一般情况下,如果对象已添加到HashSet
,如果该更改也会更改其哈希码,则永远不会更新对象。
答案 1 :(得分:10)
由于您的新User
具有不同的哈希码,因此HashSet知道它不相等。
HashSets根据他们的哈希码存储他们的项目
HashSet只会在找到具有相同哈希码的项目时调用equals
,以确保这两个项目实际上相等(而不是哈希冲突)