【发布时间】:2013-07-12 07:12:30
【问题描述】:
我试图在论坛中回答this 的问题,我发现尽管在Employee 类中覆盖了equals 方法,我仍然可以向TreeSet 添加重复的元素。
TreeSet.add(E)方法的Javadoc说
如果指定元素尚不存在,则将其添加到此集合中。 更正式地说,如果集合,则将指定元素 e 添加到此集合中 不包含元素 e2 使得 (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 允许多个元素,即使它们相等?
现在我像这样更改了Employee 的compareTo 方法
public int compareTo(Employee emp) {
return this.employeeName.compareTo(emp.employeeName);
}
输出是
true
[Name is: A Emp id is: 1]
TreeSet 在覆盖 compareTo 后如何正常工作?
【问题讨论】:
标签: java collections treeset