我一直在为 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};
运行和编译代码表明,第一种情况下 set 的大小是 3,而第二种情况下是 2。为什么?
在情况 1 中,虽然 equals 方法被覆盖,但它永远不会被调用。这是否意味着如果 hashCode 方法没有被覆盖, add() 方法不会检查对象是否相等?
在情况 2 中,具有给定实现的 hashCode 和给定的 Test 对象集总是返回相同的数字。这与默认的 hashCode 实现有什么不同,为什么会导致 equals 被调用?