// 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()
方法吗?
答案 0 :(得分:17)
返回与默认方法hashCode()返回的给定对象相同的哈希码,无论给定对象的类是否覆盖hashCode()。
答案 1 :(得分:0)
您可以使用System.identityHashCode
或super.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()