【发布时间】:2012-10-26 16:32:45
【问题描述】:
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() 方法?
【问题讨论】:
-
@Rohit Jain 的回答解释了堆栈溢出。但我建议不要仅仅为了获取哈希码而生成字符串。在这种情况下,为什么不直接使用
collarID ^ String.valueOf(name).hashCode()? -
这是我在模拟考试中做错的一道题
-
我明白了。那么,这一定是一个令人讨厌的惊喜。为了将来参考,假设 Java 尝试使默认实现说不相等是一个很好的经验法则,除非您另有说明。这会导致更少的意外行为。为此,未定义
toString、equals、hashCode的类的实例将显示不同的字符串、哈希码并表示它们不相等。
标签: java string collections scjp ocpjp