java - 不同的哈希码但 HashMap 不起作用

标签 java collections hashmap hashcode

我有一个类 myDemoClass 来存储名称,还有一个类要放入 HashMap 中。在尝试重写 hashCode() 方法时,即使哈希码不同,HashMap 也会返回 null。为什么?我已经重写了 hashCode() 方法,以便不同的对象即使具有相同的名称值也将具有不同的哈希码。

public class myDemoClass {

    String name;
    int value;
    static int i=1;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int hashCode()
    {
        //return name.hashCode();//now the hashcode are same
        return i++;//now the hashcode is different
    }

    public boolean equals(Object obj)
    {
        myDemoClass m=(myDemoClass)obj;
        if(obj==this)
            return true;

        if(obj instanceof myDemoClass)
        {
            return getName().equals(m.getName());
        }

        return false;
    }

}

public class Hashcodes {

    myDemoClass m1=new myDemoClass();
    myDemoClass m2=new myDemoClass();

    HashMap h=new HashMap();

    public boolean test()
    {
        m1.setName("s");
        m2.setName("s");
        System.out.println(m1.hashCode());
        System.out.println(m2.hashCode());

        h.put(m1, "a1");
        h.put(m1, "b1");

        System.out.println(h.get(m1));
        System.out.println(h.get(m2));
        System.out.println(h.get(m1));

        return true;
    }

    public static void main(String args[])
    {
        Hashcodes h=new Hashcodes();
        h.test();
    }

}

具有不同哈希码的输出:

1
2
null
null
null

具有相同哈希码的输出:

115
115
b1
b1
b1

最佳答案

请注意,您使 hashCode() 函数返回一个静态字段,每次调用 hashCode() 时该字段都会递增。这导致每次调用时哈希码都不同,即使对于同一个对象也是如此!

例如,假设您有以下代码:

MyDemoClass m1 = new MyDemoClass();
m1.hashCode();
m1.hashCode();

第一次调用 hashCode() 返回 1,然后静态字段增加到 2。下一次调用 hashCode() 返回 2,这与之前的不同。由于对象不跟踪它们的个人哈希代码并且每次都引用相同的静态字段,因此您的对象永远不会返回相同的哈希代码,并且您的 HashMap 将始终返回 null 值。

关于java - 不同的哈希码但 HashMap 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11368291/

相关文章:

c# - 有没有办法将所有查询字符串名称/值对放入一个集合中?

data-structures - 哈希表和单独链接 : How do you know which value to return from the bucket's list?

java - switch case java 之外的变量

ios - 在 Collectionview 中如何根据选择设置颜色?

java - 寻找 java SFTP 现代库,而不是 jsch

java - 按值对 HashMap 进行排序

java - 无法理解 docs.oracle 上 Java Map 接口(interface)的一部分

java - Heroku 应用程序不显示以 UTF-8 作为默认编码的西里尔字符

java - 从三个 Android 位置提供者给出最佳位置估计的方法

java - 为什么我的 native 查询比 JPA 查询更快?