1.未重写hashCode()和equals()方法
import java.util.HashMap;
import java.util.Map;
public class User {
private String userName;
public User(String userName) {
this.userName=userName;
}
public static void main(String[] args) {
//user1和user2是同一个人
User user1=new User("小李");
User user2=new User("小李");
Map<User,String> userMap=new HashMap<>();
userMap.put(user1,"你好");
//下面输出null
System.out.println(userMap.get(user2));
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
我们想通过user2拿到user1的值,没有重写User的hashCode()方法,user1和user2会调用基类Object的hashCode()方法,默认返回对象的内存地址。此时user1和user2通过hashCode()获取到的值是不一样的,所以userMap.get(user2)会返回null。
2.只重写hashCode()方法
import java.util.HashMap;
import java.util.Map;
public class User {
private String userName;
public User(String userName) {
this.userName=userName;
}
public static void main(String[] args) {
//user1和user2是同一个人
User user1=new User("小李");
User user2=new User("小李");
Map<User,String> userMap=new HashMap<>();
userMap.put(user1,"你好");
//下面输出null
System.out.println(userMap.get(user2));
}
@Override
public int hashCode(){
return userName.hashCode();
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
只重写hashCode()到了同一个桶但还需判断桶下面的值都是hash值相同的,还需调用equals()方法判断两者是否相等。未重写equals(),会使用Object()的equals()方法,比较两个对象的内存地址是否相等,这里user1和user2不相等,所以userMap.get(user2)会返回null。
3.重写hashCode()和equals()方法
import java.util.HashMap;
import java.util.Map;
public class User {
private String userName;
public User(String userName) {
this.userName = userName;
}
public static void main(String[] args) {
//user1和user2是同一个人
User user1 = new User("小李");
User user2 = new User("小李");
Map<User, String> userMap = new HashMap<>();
userMap.put(user1, "你好");
//下面输出 你好
System.out.println(userMap.get(user2));
}
@Override
public int hashCode() {
return userName.hashCode();
}
@Override
public boolean equals(Object o) {
if (!(o instanceof User)) {
return false;
} else {
return this.getUserName().equals(((User) o).getUserName());
}
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
博客详细解释了HashMap中equals()和hashCode()方法的重要性。未重写这两个方法时,即使对象内容相同,也无法正确映射。只重写hashCode()会导致对象存入同一桶但无法通过equals()判断相等。而同时重写hashCode()和equals()才能确保按内容查找对象的正确性。示例代码展示了这一过程。
978

被折叠的 条评论
为什么被折叠?



