重写之后的方法
/**
* 重写之后的equals方法和hashcode方法
*/
@Override
public boolean equals(Object o) {
// 如果地址一样肯定相等
if (this == o) return true;
// 如果不是同一类,则肯定不相等
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
// 比较内容,如果是同一类且内容相等,则返回true
if (username != null ? !username.equals(user.username) : user.username != null) return false;
return age != null ? age.equals(user.age) : user.age == null;
}
@Override
public int hashCode() {
int result = username != null ? username.hashCode() : 0;
result = 31 * result + (age != null ? age.hashCode() : 0);
return result;
}
Object类中的此两个方法
因为Object的equals方法是两个对象的引用值得比较,意思就是指向同一地址就相等,否则就相等;如果你需要利用对象里的值来判断是否相等,则重写equal方法
如果不重写equals方法,则对象调用此方法时调用的是父类Object中的equals方法,比较的是两个对象的地址值是否相等,如果重写了equals方法,则先比较地址值,如果地址值不一样,则进一步比较内容是否相等
Hashcode方法得到的哈希码和地址值默认是一致的,地址值即为哈希码转为了十六进制,不重写hashcode方法,则调用的Object的hashcode方法,如果重写了hashcode方法,则会按照重写的方法计算hash值,重写后的hashcode方法是将对象的内容按照ASCII表找到对应的字符,按照一定计算方式计算出一个数值
需要重写此两个方法的情况
如果对象作为map的key,此时如果同类型的两个对象的内容相同,需要覆盖之前的key就需要重写equals方法和hashcode方法,如果只有在同一个对象的时候才覆盖key则不需要重写equals方法和hashcode方法