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

8

//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()方法。这可能听起来很傻,但我能同时使用相同的学生对象(s1和s2)访问java.lang.Object.hashCode()方法吗?


1
super.hashCode(),但在我看来这没有什么用处。 - Rohit Jain
3个回答

22

使用 System.identityHashCode 可以获得相同的哈希码,无论给定对象所属类是否重写了 hashCode() 方法。


1
你可以使用 System.identityHashCode 或者 super.hashCode()。另外,你应该编写一个更好的哈希码,因为任何名字长度和卷长度之和相等的学生将具有相同的哈希码。比如(9, "Bob") 和 (7, "Steve")。这将为未来的 bug 带来很多潜在问题。省点事,最好像这样编写代码:
 public int hashCode() {
      int hash = 31 * roll;
      hash = 31 * hash + name.hashCode();
      return hash;
 }

此外,请注意您的 equals 方法不符合 JLS 中的 equals 方法。
this.equals(null) 应该返回 false,而您的方法会抛出 ClassCastException 异常。
这也可能导致未来出现错误。

是的!那个hashcode方法只是用于测试。不管怎样,感谢你的建议! - Shiva Mothkuri
1
HashCodeBuilder是你的好朋友! - chrylis -cautiouslyoptimistic-

0

写出类似这样的东西:

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

当您想要使用原始哈希码时,请调用s.originalHashCode()。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接