了解包含 Java HashSet 的方法

2022-09-03 05:41:25

关于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的来源,它必须调用它。方法等于 User 只是对用户名调用 equals。方法哈希代码 返回用户名的哈希代码


答案 1

如果哈希代码方法基于字段,然后在添加对象后对其进行更改,则第二次检查将使用新的哈希值,并且不会找到您要查找的对象。这是因为第一次按哈希代码进行搜索,因此如果搜索失败,他们不会打扰调用。namecontainsHashSetequals

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

通常,在将对象添加到某个对象后,如果该更改也会更改其哈希代码,则永远不应更新该对象。HashSet


答案 2

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

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