java - 重写 hashcode() 方法后出现奇怪的结果

标签 java hashmap

我有以下情况-

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

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

  3. 我重写了 hashcode() 方法,以便它在每次调用时返回不同的整数。

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

这给了我完全意想不到的结果 - 三个键值对的每个值都为 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++;}
}

最佳答案

  • 当您将一个对象放入映射中时,映射将读取该键的哈希码并将其放入适当的存储桶中;

  • 当您稍后通过同一键获取对象时,映射将再次读取该键的哈希码并查找与该键相等的对象桶;

  • 但是您的 key 每次都会为映射提供不同的哈希码。因此,可怜的 map 被欺骗去寻找错误的桶。

关于java - 重写 hashcode() 方法后出现奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25206897/

相关文章:

java - 我怎样才能将一个对象实例传递给java中的线程,这样即使实例值被更新也不应该影响使用它的线程

java - 如何避免过多的空比较

java - 每次我使用 .put() 时,HashMap 都会被覆盖

java - 输入重复键时保留原始键/值的 HashMap

java - 将 HashMap 添加到 HashMap 数组中

Java Jersey 2 json 支持

java - 如何仅从键盘获取整数输入,如果输入无效,如何再次询问用户?

java - 两个对象之间的元素流?

java - 散列如何有一个 o(1) 的搜索时间?

Java 集合实现(例如 HashMaps vs HashSet vs HashTable ...),选择错误的代价是什么?