为什么我不能使用toString().length()作为hashCode()返回?

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 hashCodeequals方法.仅使用attributes计算hashCode中用于比较instancesin equals方法的那些.

有关更多详细信息hashCodeequals方法,请参阅以下链接: -