如何在覆盖它之后使用原始的hashCode()方法

时间:2013-08-02 15:26:48

标签: java

// Student.java

class Student{
private int roll;
private String name;

    public Student(int roll,String name){
    this.roll=roll;
    this.name=name;
    }

    public int hashCode(){
    return roll+name.length();
    }

    public  boolean equals(Object obj){
    Student s=(Student)obj;
    return (this.roll==s.roll && this.name.equals(s.name));
    }

}

// IssueID.java

class IssueID{

    public static void issueID(Student s1,Student s2){

    if(s1.equals(s2))
    System.out.println("New ID issued");

    else
    System.out.println("New ID NOT issued");

    }

}

// Institute.java

import java.lang.Object;
class Institute{
    public static void main(String[] args){
    Student s1=new Student(38,"shiva");
    Student s2=new Student(45,"aditya");

    IssueID.issueID(s1,s2);


    System.out.println(s1.hashCode());
    System.out.println(s2.hashCode());
    }

}

与上面的代码一样,我已经覆盖了hashCode()方法。这可能听起来很愚蠢,但是我可以同时使用相同的Student对象(s1和s2)来访问java.lang.Object.hashCode()方法吗?

3 个答案:

答案 0 :(得分:17)

是的,System.identityHashCode

  

返回与默认方法hashCode()返回的给定对象相同的哈希码,无论给定对象的类是否覆盖hashCode()。

答案 1 :(得分:0)

您可以使用System.identityHashCodesuper.hashCode()此外,您应该编写更好的哈希代码,因为任何名称长度和滚动相等的学生都将具有相同的哈希码。喜欢(9,“鲍勃”)和(7,“史蒂夫”)。这将为未来的bug带来许多潜在的问题。保护自己头痛并写下这样的东西:

 public int hashCode() {
      int hash = 31 * roll;
      hash = 31 * hash + name.hashCode();
      return hash;
 }

另外,请注意您的equals方法不满足JLS中的equals方法。

this.equals(null)应该返回false,你的将抛出ClassCastException。

这也可能导致未来的错误。

答案 2 :(得分:0)

写下这样的东西:

class Student {
    public int originalHashCode() {
        return super.hashCode();
    }
}

然后在你想使用原始的一个〜

时调用s.originalHashCode()