为什么即使我重写hashcode方法,也会在内部调用String类的hashcode方法

时间:2015-04-09 10:11:20

标签: java hashmap hashcode

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的哈希码方法而不是调用我的重写方法

2 个答案:

答案 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