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;
}
}