关于HashMap的key变化问题???
public class A {
private int i=0;
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
public int hashCode() {
return i;
}
public boolean equals(Object o){
return (o instanceof A) && (i==((A)o).getI());
}
public static void main(String[] args){
HashMap <A, String> hm = new HashMap <A,String> ();
A a = new A();
hm.put(a, "a ");
System.out.println( "@@@ "+hm.get(a));
a.setI(9);
System.out.println( "&&& "+hm.get(a));
}
}
输出结果为什么是:
@@@a
&&&null
------解决方案--------------------你搞错了,第一个hashCode是0,第二个才是9。不一样。
------解决方案--------------------key对象修改了,hashCode已经变了,HashMap中已经找不到这个key了,属于程序错误。
------解决方案--------------------这是hashmap的get方法代码,相信你看了以后就明白原因了:
public Object get(Object key) {
Object k = maskNull(key);
int hash = hash(k);
int i = indexFor(hash, table.length);
Entry e = table[i];
while (true) {
if (e == null)
return e;
if (e.hash == hash && eq(k, e.key))
return e.value;
e = e.next;
}
}