Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重写后如何使用原始hashCode()方法_Java - Fatal编程技术网

Java 重写后如何使用原始hashCode()方法

Java 重写后如何使用原始hashCode()方法,java,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

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

是,使用:

为给定对象返回与默认方法hashCode()返回的哈希代码相同的哈希代码,无论给定对象的类是否重写hashCode()


您可以使用
System.identityHashCode
super.hashCode()
此外,您应该编写一个更好的哈希代码,因为任何名称和滚动长度之和相等的学生都将具有相同的哈希代码。比如(9,“鲍勃”)和(7,“史蒂夫”)。这将为未来的bug带来许多潜在问题。省去你的烦恼,写下这样的话:

 public int hashCode() {
      int hash = 31 * roll;
      hash = 31 * hash + name.hashCode();
      return hash;
 }
class Student {
    public int originalHashCode() {
        return super.hashCode();
    }
}
另外,请注意,equals方法不满足JLS中的equals方法

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


这也可能导致将来出现bug。

写下如下内容:

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

然后,当您想使用原始的hashCode()时,调用s.originalHashCode()。

super.hashCode()
,但这对IMHO没有用。耶!该hashcode方法仅用于测试。无论如何,谢谢你的建议!他是你的朋友!