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使用した属性を考慮して、 betweenとメソッドequalsを維持するように実装を設計する必要があります。inメソッドの比較に使用したもののみを計算に使用してください。contracthashCodeequalsattributeshashCodeinstancesequals

方法の詳細については、次のリンクを参照してくださいhashCode。-equals

于 2012-10-26T16:36:26.307 に答える