我一直在学习OCJP(以前的SCJP),我遇到了以下使用LinkedHashSet的示例:
public class Test{
int size;
public Test(int s){
this.size = s;
}
@Override
public boolean equals(Object obj) {
return (this.size == ((Test)obj).size);
}
public static void main(String[] args) {
LinkedHashSet<Test> s = new LinkedHashSet<Test>();
s.add(new Test(1));
s.add(new Test(2));
s.add(new Test(1));
System.out.println(s.size());
}
}
现在的问题是,如果:
1)实现保持不变
2)将hashCode的覆盖插入到Test类中,那么会显示什么:
public int hashCode() {return size/5};
运行和编译代码后发现,在第一种情况下,集合的大小是3,而在第二种情况下,集合的大小是2。 为什么?
在第一个案例中,尽管equals方法被覆盖,但它从未被调用。这是否意味着如果未覆盖hashCode方法,add()方法将不检查对象相等性? 在第二个案例中,给定实现和测试对象集的hashCode始终返回相同的数字。这与默认的hashCode实现有何不同,并为什么这会导致调用equals方法?