1
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() 方法?

4

1 回答 1

11

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

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

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

这肯定会导致StackOverFlowError

您宁愿重写toString类中的方法,以使其工作。

PS: -

但是,您的hashCode实现应该被设计,考虑到您在equals方法中使用的属性,以维护contract中间hashCodeequals方法。只使用那些你用来比较你的方法的attributes计算。hashCodeinstancesequals

hashCode有关方法的更多详细信息,请参阅这些链接equals:-

于 2012-10-26T16:36:26.307 回答