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

//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()方法吗?

是的,使用System.identityHashCode

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

写这样的东西:

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

然后在你想使用原来的〜时调用s.originalHashCode()

您可以使用System.identityHashCodesuper.hashCode()此外,您应该编写更好的哈希代码,因为任何名称长度和roll相等的学生将具有相同的哈希码。 喜欢(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。

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