我知道这可能是一个非常愚蠢的问题,但是在了解了关于HashSet
的知识后,当我执行下面的代码时感到困惑。
我有一个如下的Employee类(只保留相关的代码片段):
public class Employee {
//assume it has 3 variable name(String),salary(double) and id(int)
//assume the constructor, getter-setters are there
//following is my equals and hashCode implementation
public boolean equals(Employee e){
return name.equals(e.name);
}
public int hashCode(){
return id;
}
}
现在我有以下使用HashSet
的代码:
Employee e1 = new Employee("Abc", 2.0, 1);
Employee e2 = new Employee("abc", 3.0, 4);
Employee e3 = new Employee("XYZ", 4.0, 3);
Employee e4 = new Employee("Mno", 5.0, 2);
Employee e5 = new Employee("Abc", 77.0, 1);
Set<Employee> sEmp = new HashSet<Employee>();
sEmp.add(e1);
sEmp.add(e2);
sEmp.add(e3);
sEmp.add(e4);
sEmp.add(e5);
for(Employee e : sEmp){
System.out.println(e);
}
所以我在控制台上打印出所有对象数据如下:
Abc 77.0 1
Abc 2.0 1
Mno 5.0 2
XYZ 4.0 3
abc 3.0 4
据我所知,集合不允许重复项,并且会在使用
equals
方法时检查重复性(如果我错了,请纠正我)。另外,
HashSet
使用hashCode
,因此在上述情况下,它不应该添加对象e5
。但是它成功地将该元素添加到了集合中。这让我困惑不解。(请忽略我是否遗漏了标准等所有内容,我正在尝试理解概念/实现)。 编辑:这可能听起来是一个愚蠢的问题,但我正在为认证做准备,想看看事情是如何工作的。