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

时间:2012-10-26 16:32:46

标签: 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
    }
}

我错过了什么?是否因为默认的toString()方法而对hashCode()方法进行了循环调用?

1 个答案:

答案 0 :(得分:11)

如果您看到toString类的Object方法的源代码,它看起来像: -

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

因此,它在内部调用hashCode()方法。现在,由于您已经覆盖了hashCode方法,因此它会调用您的类的hashCode方法,这会再次调用toString类的Object方法。

这肯定会导致StackOverFlowError

您可以覆盖班级中的toString方法,以使其有效。

P.S。: -

但是,考虑到您在hashCode方法中使用的属性,应设计equals实施,以在contracthashCode之间保持equals方法。仅使用attributes计算hashCode用于比较instances equals方法的hashCode

有关equals和{{1}}方法的详细信息,请参阅以下链接: -