如果hashCode没有被覆盖,为什么HashSet可以包含多个具有相同属性的对象?

时间:2016-04-07 15:38:49

标签: java hashcode

我在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);
    }
}

以下陈述(只有一个是真的):

  • 甲。编译失败,因为未覆盖hashCode方法
  • B中。 HashSet可以包含多个具有相同名称的Person对象。
  • ℃。所有Person对象将具有相同的哈希码,因为hashCode方法未被覆盖
  • d。如果HashSet包含多个Person对象,其名称为" Fred"然后删除另一个人,名字="弗雷德",将删除所有人。

答案是(B),但我不明白为什么。有人可以解释一下吗?

1 个答案:

答案 0 :(得分:1)

作为一般规则:始终确保obj1.equals(obj2),然后obj1.hashCode() == obj2.hashCode()

在您的情况下,由于hashCode未被覆盖,因此它使用Object中定义的默认值,但未考虑对象的任何属性 - 你通常会发现new Object().hashCode() != new Object().hashCode()

在这种情况下,如果您有两个具有相同名称的Person个对象,它们很可能会以不同的hashCode值结束,从而允许它们在集合中共存:您的HashSet可以包含多个Person具有相同名称的对象,即答案(B)。

这就是覆盖hashCodeequals同样重要的原因 - 如果你的对象相同,但不生成相同的hashCode,他们就赢了在基于散列的集合中使用它们时表现正常。 This related question有更多关于不同情况下会发生什么的细节。