我试图在论坛中回答这个问题,我发现尽管重写了类中的equals
方法Employee
,我仍然能够向TreeSet
.
TreeSet.add(E)方法的 Javadoc说
如果指定的元素尚不存在,则将其添加到此集合中。更正式地说,如果集合不包含元素 e2,则将指定的元素 e 添加到此集合中,使得 (e==null ? e2==null : e.equals(e2))。如果该集合已包含该元素,则调用将保持该集合不变并返回 false。
这实质上意味着不会插入 2 个等于对象TreeSet
,并且相等性仅由equals()
包含对象的方法确定。
但是,下面的代码添加了 2 个元素,Set
即使它们相等
public class Employee implements Comparable<Employee> {
String employeeName;
int employeeId;
public Employee(String name, int id) {
this.employeeName = name;
this.employeeId = id;
}
public int compareTo(Employee emp) {
//return this.employeeName.compareTo(emp.employeeName);
return (this.employeeId - emp.employeeId);
}
@Override
public String toString() {
return ("Name is: " + employeeName + " Emp id is: " + employeeId);
}
@Override
public boolean equals(Object emp) {
if(emp instanceof Employee &&((Employee)emp).employeeName.equals(this.employeeName)){
return true;
}
return false;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Set<Employee> set = new TreeSet<Employee>();
Employee e1 = new Employee("A", 1);
Employee e2 = new Employee("A", 2);
System.out.println(e1.equals(e2));
set.add(e1);
set.add(e2);
System.out.println(set);
}
}
这是输出
true
[Name is: A Emp id is: 1, Name is: A Emp id is: 2]
为什么TreeSet
即使它们相等也允许多个元素?
现在我改变了这样的compareTo
方法Employee
public int compareTo(Employee emp) {
return this.employeeName.compareTo(emp.employeeName);
}
输出是
true
[Name is: A Emp id is: 1]
覆盖后如何TreeSet
正常工作compareTo
?