不同的哈希码,但哈希映射不工作

问题描述:

我有一个类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将始终返回空值。

我同意上面的答案,使用静态字段来计算一个对象的hashCode是不好的做法。请考虑只使用非静态字段,在你的情况 - 执行中出了什么问题:
public int hashCode() { return name.hashCode()* 31 +(new Integer(value))。hashCode(); }