我在OCPJP期间遇到了这个问题。
鉴于代码:
public class Person {
private String name;
public Person(String name) {
this.name = name;
}
public boolean equals(Object o) {
if (!(o instanceof Person)) return false;
Person p = (Person)o;
return p.name.equals(this.name);
}
}
以下陈述(只有一个是真的):
答案是(B),但我不明白为什么。有人可以解释一下吗?
答案 0 :(得分:1)
作为一般规则:始终确保obj1.equals(obj2)
,然后obj1.hashCode() == obj2.hashCode()
在您的情况下,由于hashCode
未被覆盖,因此它使用Object
中定义的默认值,但未考虑对象的任何属性 - 你通常会发现new Object().hashCode() != new Object().hashCode()
。
在这种情况下,如果您有两个具有相同名称的Person
个对象,它们很可能会以不同的hashCode值结束,从而允许它们在集合中共存:您的HashSet
可以包含多个Person
具有相同名称的对象,即答案(B)。
这就是覆盖hashCode
和equals
同样重要的原因 - 如果你的对象相同,但不生成相同的hashCode,他们就赢了在基于散列的集合中使用它们时表现正常。 This related question有更多关于不同情况下会发生什么的细节。