我看了一些代码,发现有一个程序扩展了集合的HashSet类。他们创建了自定义的员工对象,并将其插入Set中,而不实现Comparable或Comparator接口。他们实现了逻辑来识别重复的员工对象,所以如果对象已经存在,他们就可以执行更新操作;如果对象不存在,他们就可以执行插入操作。我试图理解集合如何在没有实现Comparable或Comparator接口的情况下识别重复对象。
我尝试了相同的操作,并尝试重写Hashcode和equals方法以理解Set如何比较对象。我发现当我将相同的对象添加到Set时,它产生相同的Hashcode。但它没有调用我重写的equals方法。
class Employee {
int id;
String name;
Employee(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public int hashCode() {
System.out.println("HashCode : " + super.hashCode());
return super.hashCode();
}
@Override
public boolean equals(Object o) {
System.out.println("Equals : " + super.equals(o));
return super.equals(o);
}
}
class LimitedHashSet extends HashSet<Employee> {
public boolean add(Employee e) {
if(!super.add(e)){
return false;
}
return true;
}
}
public class ExtendingHashSet {
public static void main (String[] args) {
Employee e0 = new Employee(1,"A");
Employee e1 = new Employee(2,"B");
LimitedHashSet obj = new LimitedHashSet();
System.out.println("Element added ? " + obj.add(e0) + "\n");
System.out.println("Element added ? " + obj.add(e1) + "\n");
System.out.println("Element added ? " + obj.add(e0) + "\n");
}
}
Hashcode被用于计算桶(bucket),而equals方法则用于识别是否相等。那么它是如何在这里工作的呢?请查看下面的输出。
输出:
HashCode: 914424520 元素已添加?true
HashCode: 110718392 元素已添加?true
HashCode: 914424520 元素已添加?false
obj.add(e0)
,而不是obj.add(e3)
。 - Jon Skeete3
而不是e0
? - Andy TurnerLimitedHashSet
中重写add
方法有什么作用?看起来这等同于直接调用return super.add(e);
。 - Andy TurnerEmployee
,而不是它的hashCode
。目前具有相同属性值的Employee
对象具有不同的哈希码,根据上面的实现。 - Louis Wasserman