import java.util.HashMap;
import java.util.Map;
public class TestClass {
@Override
public boolean equals(Object obj) {
return false;
}
@Override
public int hashCode() {
return 1;
}
public static void main(String[] args) {
HashMap<TestClass, Integer> hm = new HashMap<TestClass, Integer>();
hm.put(new TestClass(), 1);
hm.put(new TestClass(), 2);
hm.put(new TestClass(), 3);
for (Map.Entry<TestClass, Integer> m : hm.entrySet()) {
System.out.println(m.getKey() + " " + m.getValue());
}
}
}
我在我的TestClass中覆盖了哈希码,但是在调试时我发现它调用了String的哈希码方法而不是调用我的重写方法
答案 0 :(得分:2)
将调试点放在String哈希码上并尝试调试。我猜这里的问题不太清楚。我的意思是为什么在我定义自己的时候调用字符串类哈希码
我尝试了你的代码并在String::hashCode
上设置了一个断点。断点被击中,但不是你的代码。
在调用堆栈中,我看到String.hashCode()
调用Properties(HashTable<K,V>).get(Object)
,由Properties.getProperty(String)
调用System.getProperty(String)
调用main()
。即使我使用空hashCode
方法运行程序,也会调用此方法。
您的代码使用您自己的{{1}}方法(返回1)。
答案 1 :(得分:0)
你的hashmap
每次都会使用相同的哈希码覆盖对象类的哈希码方法,因此在一个桶中会有很多对象被覆盖而你正在覆盖Object的类的equals
方法,而不是{ {1}}课程了解更多信息find this link which I had faced the same question