public class Dog
{
int collarID;
String name;
public static void main(String[] args){
Dog d = new Dog();
d.name="hose";
System.out.print(d.hashCode());
}
public boolean equals(Object arg0)
{
if (arg0 instanceof Dog)
{
Dog new_name = (Dog) arg0;
return collarID==new_name.collarID && new_name.name.equals(name);
}
return false;
}
public int hashCode()
{
return toString().length();//StackOverflow
}
}
我错过了什么?是否因为默认的toString()方法而对hashCode()方法进行了循环调用?
答案 0 :(得分:11)
如果您看到toString
类的Object
方法的源代码,它看起来像: -
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
因此,它在内部调用hashCode()
方法。现在,由于您已经覆盖了hashCode
方法,因此它会调用您的类的hashCode
方法,这会再次调用toString
类的Object
方法。
这肯定会导致StackOverFlowError
您可以覆盖班级中的toString
方法,以使其有效。
P.S。: -
但是,考虑到您在hashCode
方法中使用的属性,应设计equals
实施,以在contract
和hashCode
之间保持equals
方法。仅使用attributes
计算hashCode
用于比较instances
equals
方法的hashCode
。
有关equals
和{{1}}方法的详细信息,请参阅以下链接: -