use*_*512 15 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));
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么这段代码输出错误?而且这段代码甚至不调用User的equals方法.但根据HashSet和HashMap的来源,它必须调用它.方法等于用户只需在用户名上调用equals.方法hashCode返回用户名的hashCode
dle*_*lev 15
如果哈希码方法基于该name字段,然后在添加对象后更改它,则第二次contains检查将使用新的哈希值,并且将找不到您要查找的对象.这是因为HashSet首先通过哈希码进行搜索,因此equals如果搜索失败,他们就不会打扰.
唯一可行的方法是,如果你没有覆盖equals(因此使用了默认的引用相等),你很幸运,两个对象的哈希码相等.但这是一个非常不可能的情况,你不应该依赖它.
通常,在将对象添加到a之后,如果该对象也将更改其哈希码,则永远不应更新该对象HashSet.
SLa*_*aks 10
由于您的new User具有不同的哈希码,因此HashSet知道它不相等.
HashSets根据其哈希码存储其项目.
HashSet只会equals在找到具有相同哈希码的项目时调用,以确保这两个项目实际上相等(而不是哈希冲突)