理解包含Java HashSet的方法

时间:2011-08-11 13:18:24

标签: java contains hashset

关于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

2 个答案:

答案 0 :(得分:13)

如果哈希码方法基于name字段,然后在添加对象后更改它,那么第二个contains检查将使用新的哈希值,并且将无法找到你正在寻找的对象。这是因为HashSet首先按哈希码搜索,因此如果搜索失败,他们就不会打扰调用equals

唯一可行的方法是,如果你没有覆盖equals(因此使用默认的引用相等性)你很幸运两个对象的哈希码是相等的。但这是真的不太可能的情况,你不应该依赖它。

一般情况下,如果对象已添加到HashSet,如果该更改也会更改其哈希码,则永远不会更新对象。

答案 1 :(得分:10)

由于您的新User具有不同的哈希码,因此HashSet知道它不相等。

HashSets根据他们的哈希码存储他们的项目 HashSet只会在找到具有相同哈希码的项目时调用equals,以确保这两个项目实际上相等(而不是哈希冲突)