Joe*_*Joe 1 java string collections scjp ocpjp
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
}
}
Run Code Online (Sandbox Code Playgroud)
我错过了什么?是否因为默认的toString()方法而对hashCode()方法进行了循环调用?
Roh*_*ain 11
如果你看到类的toString方法的源代码Object,它看起来像: -
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
Run Code Online (Sandbox Code Playgroud)
所以,它在内部调用hashCode()方法.现在,既然你已经覆盖了hashCode方法,它将调用hashCode你的类的方法,它再次调用类的toString方法Object.
这肯定会导致 StackOverFlowError
您可以覆盖toString类中的方法,使其工作.
PS: -
但是,hashCode考虑到您在equals方法中使用的属性,应该设计您的实现,以维护contractbetween hashCode和equals方法.仅使用attributes计算hashCode中用于比较instancesin equals方法的那些.
有关更多详细信息hashCode和equals方法,请参阅以下链接: -
Effective Java - Item # 8 - Obey the general contract when overriding equalsEffective Java - Item # 9 - Always override hashCode when you override equals