2013-05-11 83 views
0

我有一个类学校:有效和高效地实施的hashCode()

public class School{ 

    private int noOfTeachers; 
    private int noOfStudents; 

    //setters and getters.... 

    public boolean equals(Object that){ 
    //instance of check.. 
     return (this.noOfTeachers == ((School)that).noOfTeachers || 
       this.noOfStudents== ((School)that).noOfStudents); 
    } 


    public int hashCode(){ 
     //What goes in here??? o.O 
    } 
} 

我应该如何与实施hashCode这个类进行?我无法想到一个包含noOfTeachersnoOfStudents计算散列的策略。而noOfTeachersnoOfStudents组合似乎违反了equalshashCode之间的合同。

+7

你是对的 - 任何与“或”的平等检查都会违反传递性。 – 2013-05-11 18:21:07

+1

我不明白你的意思。当然,你可以'返回1' - 但是这样做是无用的,因为你的类不能在'HashMap'和'HashSet'中工作。你用什么“equals”方法? – 2013-05-11 18:24:25

+0

我认为你最好的选择是离开'equals'和'hashCode'并创建一个方法来检查它。覆盖这些方法的原因是,'Collection'使用'equals'方法而不是使用'=='的默认方式来尊重相等性。 – 2013-05-11 18:28:43

回答

2

你不会找到任何适合你的课程的hashCode()实现,这将符合你的需求!因为你的equals方法使用OR它的属性的类。在equals方法中使用OR可为任何对象的多个状态返回true

所以使用hashCode()的唯一返回值,你当然不能表示多个状态!更多的你应该知道,hashCode()必须返回一个对象的唯一值。 由于通过它返回多个值,导致模糊(并损害确定性)将对象放入任何地图。因为这违反了“地图的键的唯一性”的假设。

+2

这当然不起作用。 OP想要一个**或**的“equals”方法。 – 2013-05-11 18:26:03

+0

如果两个对象按照equals方法相等,那么在这两个对象的每一个上调用hashCode方法必须产生相同的**结果 – Anirudha 2013-05-11 18:33:33

+0

@BoristheSpider,我现在要求您再次看到答案,谢谢! – 2013-05-11 18:48:26