【问题标题】:Why hashcode method of String class is called internally even if i override hashcode method为什么即使我覆盖哈希码方法,也会在内部调用 String 类的哈希码方法
【发布时间】:2015-06-14 15:36:07
【问题描述】:
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中重写了hashcode,但是在调试时我发现它正在调用String的hashcode方法而不是调用我的重写方法

【问题讨论】:

  • String 是最终类。不能覆盖 String 的 hashcode 方法
  • 调试时你在哪一行接到电话?
  • 您正在覆盖 Object class's hashCode 方法,而不是 String 类!
  • 我运行了你的代码,每个键都被打印为 packagename.TestClass@1,这意味着你的 hashCode,总是返回 1,被确定使用。是什么让你觉得 String 的 hashCode 被使用了?
  • 没有String 参与此代码,它完美地发挥了它的作用;)

标签: java hashmap hashcode


【解决方案1】:

将调试点放在字符串哈希码上并尝试调试。我猜我的问题在这里没有很好理解。我的意思是为什么在我定义自己的时候调用字符串类哈希码

我尝试了您的代码并在String::hashCode 上放置了一个断点。断点被击中,但不是你的代码。

在调用堆栈中我看到String.hashCode()Properties(HashTable&lt;K,V&gt;).get(Object) 调用,Properties.getProperty(String) 又被System.getProperty(String) 调用。即使我使用空的 main() 方法运行程序也会调用此方法。

您的代码使用您自己的 hashCode 方法(返回 1)。

【讨论】:

  • Eran,为什么它调用 String.hashcode() 而为什么不是我的 TestClass 的 hashcode()
  • @user3405305 我以为我很清楚。无论您的代码如何,它都会调用String.hashCode()(请参阅调用堆栈)。您的 HashMap&lt;TestClass, Integer&gt; 确实使用了您的 hashCode()TestClass
【解决方案2】:

您的 hashmap 每次都将具有与您覆盖对象类的 hashcode 方法相同的哈希码,因此在一个桶中将驻留许多对象,并且您正在覆盖 Object 类的 equals 方法,而不是 String 类更多信息find this link which I had faced the same question

【讨论】:

    猜你喜欢
    • 2014-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-17
    • 1970-01-01
    • 2018-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多