在改变已经存入HashMap的对象o的属性的时候,由于对象的hashCode依赖于对象的属性,所以hashCode同时也被改变了,但是HashMap不会重新计算对象的位置,也就是说这个对象存在了一个错误的位置,导致调用get(o)方法的时候拿到null(因为get方法计算的o的下标变化了,会去新下标的位置去查找,但是o还是存在老下标的位置,肯定找不到),或者调用get(非o)的时候也不会误拿到对象o(因为o.equals(非o) == false
),这个对象永远不会被get到,也就是标题所说的失联了。
测试
自定义对象User,重写equals
、hashCode
方法
class User {
private String name;
public User(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int hashCode() {
return name.hashCode();
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (!(obj instanceof User)) return false;
return name.equals(((User)obj).getName());
}
}
public static void main(String[] args) {
HashMap<User, String> map = new HashMap<User, String>();
// 创建Tom放入map
User user = new User("Tom");
map.put(user, "test");
System.out.println(map.get(user));
System.out.println(map.get(new User("Tom")));
// 将Tom的名字改为Jerry
user.setName("Jerry");
System.out.println(map.get(user));
System.out.println(map.get(new User("Tom")));
System.out.println(map.get(new User("Jerry")));
}
输出如下:
test
test
null
null
null