目录
一、代码示例
1.实体类User
import java.util.Objects;
public class User {
private String userName;
private String userCode;
public User() {
}
public User(String userName, String userCode) {
this.userName = userName;
this.userCode = userCode;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserCode() {
return userCode;
}
public void setUserCode(String userCode) {
this.userCode = userCode;
}
@Override
public boolean equals(Object obj){
if(obj instanceof User){
User user = (User)obj;
return this.userName.equals(user.getUserName()) && this.userCode.equals(user.getUserCode());
}
return super.equals(obj);
}
@Override
public int hashCode(){
return Objects.hash(this.userName, this.userCode);
}
}
2.测试类
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) throws Exception {
List<User> userList = new ArrayList<User>();
User u1 = new User("name1","code1");
User u2 = new User("name2","code2");
userList.add(u1);
userList.add(u2);
//name、code都相同返回true
User u3 = new User("name2","code2");
System.out.println(userList.contains(u3));
//返回false
User u4 = new User("name1","code2");
System.out.println(userList.contains(u4));
}
}
二、简要说明
这里说一下为什么还要重写hashCode方法:
示例中list中能判断出包含了等价的对象,是没问题的,但是在Hash相关的集合contains会返回false。
因为ArrayList是根据equals来判断是否包含,而不管hashCode是否不相等。而Hash集合处理流程则不一样,先判断两个对象的hashCode方法是否一样,如果不一样,立即认为两个对象equals不相等,并不调用equals方法,当hashCode相等时,再根据equals方法判断两个对象是否相等。
三、总结
总结,所以当我们缩写的类可能用于存放在Hash相关的集合类中时,在重写equals时,需要重写hashCode,不然会出现与预期不符的结果。