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()方法進行反覆調用?爲什麼我不能使用toString().length()作爲hashCode()返回?
@Rohit耆那教的回答解釋了堆棧溢出。但我會建議不要生成一個字符串來獲取哈希碼。在這種情況下,爲什麼不使用'collarID^String.valueOf(name).hashCode()'? –
這是我在模擬考試中做錯的一個問題 – Joe
我明白了。那麼這肯定是一個令人討厭的驚喜。爲了將來的參考,假設Java嘗試使默認實現不平等,直到您另有說明爲止,這是一個很好的經驗法則。這導致更少的意外行爲。爲此,未定義「toString」,「equals」,「hashCode」的類的實例將顯示不同的字符串和散列碼,並說它們不相等。 –