重写hashcode()方法后的奇怪结果

时间:2014-08-08 15:24:22

标签: java hashmap

我有以下情况 -

  1. 我正在使用泛型创建HashMap。键的类型为TestHashMap,值的类型为String。

  2. 在TestHashMap的主要方法中,我使用三个TestHashMap实例作为存储三个不同字符串的键。

  3. 我覆盖hashcode()方法,以便在每次调用时返回一个不同的整数。

  4. 然后我在HashMap中提取密钥并打印出相应的值。

  5. 这给了我完全意想不到的结果 - 我得到了三个键值对中每个值 的 null。

    请注意,如果不是在hashcode()的不同调用上返回不同的整数,我只返回相同的整数,一切正常。

    这让我非常困扰。任何帮助将不胜感激。

    这是代码。如果你按原样复制它,你应该可以运行它。

    import java.util.HashMap;
    import java.util.Set;
    
    public class TestHashMap {
        private static int hash = 0;    
        public static void main(String[] args) {
            HashMap<TestHashMap,String> h = new HashMap<TestHashMap,String>();
            TestHashMap thm1 = new TestHashMap();
            TestHashMap thm2 = new TestHashMap();
            TestHashMap thm3 = new TestHashMap();
    
            h.put(thm1, "one");
            h.put(thm2, "two");
            h.put(thm3, "three");
    
            Set<TestHashMap> keys = h.keySet();
            for(TestHashMap k : keys){
                System.out.println(k + " " + h.get(k));
            }
        }
    
        @Override
        public int hashCode(){ return hash++;}
    }
    

1 个答案:

答案 0 :(得分:6)

  • 当您将对象放入地图时,地图会读取密钥的哈希码并将其放入相应的存储桶中;

  • 当您稍后通过相同的密钥获取对象时,地图将再次读取密钥的哈希码并查找对象等于那桶里的钥匙;

  • 但是您的密钥每次都会为地图提供不同的哈希码。因此,糟糕的地图被诱骗进入错误的桶中。