不同的哈希码,但哈希映射不工作
问题描述:
我有一个类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(); }