不同的哈希码,但HashMap无法正常工作

时间:2012-07-06 19:09:27

标签: 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

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

我同意上面的回答,使用静态字段来计算对象的hashCode是不好的做法。在您的情况下,请考虑仅使用非静态字段 - 执行时出错:
public int hashCode() {     return name.hashCode()* 31 +(new Integer(value))。hashCode(); }