//重写
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || this.getClass() != o.getClass()) {
return false;
}
User user = (User) o;
return Objects.equals(id, user.id) &&
Objects.equals(userName, user.userName) &&
Objects.equals(age, user.age);
}
@Override
public int hashCode() {
return Objects.hash(id, userName, age);
}
假设有两个对象:
User user = new User();
user.setId(1);
User user1 = new User();
user1.setId(1);
重写了equals和hashcode
System.out.println(user.equals(user1));//true
System.out.println(user.hashCode() == user1.hashCode());//true
反之只重写equals:
//true
//false
也就是说 hashcode相当于我们的身份证号,两个对象相等,hashcode一定相等;hashcode不等,两个对象一定不等。
现在,再加一行代码 user1=user;
//true
//true
说明hashcode代表了指针/内存地址。
最后,提出关键性的疑问,什么时候我会用到hashcode呢,hashcode不相等关我什么事呢,我只用到equals判断满足我的要求了不就行了?
试试map.put(user,xxx);// map key唯一性
Map<User,Integer> map = new HashMap<>();
map.put(user,1);
map.put(user1,2);
System.out.println(map);
重写hashcode输出:
{User{id=1, username='null', age=null}=2}
不重写hashcode输出:
{User{id=1, username='null', age=null}=2, User{id=1, username='null', age=null}=1}
总结
- 两个对象相等,hashcode一定相等,hashcode不等,两个对象一定不等。
- 单纯只判断对象属性值,可以只写equals不写hashcode,只是不完整(男的光着上身打篮球警察也不会抓你)。
- 如果对象作为map的key,那就必须重写hashcode,因为map是根据hashcode来控制key唯一性。