是否必须在hashCode()和equal()方法中包含集合类型字段,如Hashset

时间:2018-02-14 07:30:20

标签: java collections hashcode

在我的项目中,如果我们在hashCode()和equal()方法中包含集合字段,我已经看到了性能问题。是否必须包含?以下是示例程序。

Student.java

public class Student {
    int no;
    String name;
    String adress;
    Set < Parent > parent;    
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((adress == null) ? 0 : 
       adress.hashCode());
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        result = prime * result + no;
        result = prime * result + ((parent == null) ? 0 : 
       parent.hashCode());
        return result;
    }   
   public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Student other = (Student) obj;
    if (adress == null) {
        if (other.adress != null)
            return false;
    } else if (!adress.equals(other.adress))
        return false;
    if (name == null) {
        if (other.name != null)
            return false;
    } else if (!name.equals(other.name))
        return false;
    if (no != other.no)
        return false;
    if (parent == null) {
        if (other.parent != null)
            return false;
    } else if (!parent.equals(other.parent))
        return false;
    return true;
}      

}

1 个答案:

答案 0 :(得分:2)

对于equals()hashCode()的实施方式,没有“强制性”要求。好吧,我将在下面提到一个小问题。您可以以对应用程序有意义的任何方式实现它们。看起来您只需要考虑学生的身份证号码,因为这是学生的独特之处。当然,名字和父母并不是唯一的。

请确保equals()hashCode()基于相同的字段,以便您完成所需的合同(这是此唯一的“必需”方面)。