为什么重写equals方法
equals方法是java的顶层父类Object的方法,所有的java类都继承自Object类,因此所有的java对象也就天然的继承到了equals方法。但是这里的equals方法仅仅标识两个对象的内存地址是否一样,而不会去看其中的内容是否一致,因此我们在需要的时候需要重写equals方法。
public boolean equals(Object obj) {
return (this == obj);
}
重写后的equals方法:
public class MappedStatement {
private String sql;
private String resultType;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
MappedStatement that = (MappedStatement) o;
return Objects.equals(sql, that.sql) && Objects.equals(resultType, that.resultType);
}
@Override
public int hashCode() {
return Objects.hash(sql, resultType);
}
}
为什么要同时重写hashcode方法
在java中, 对象的equlas方法和hashcode方法都有比较两个对象是否相等的作用。父类Object中,hashcode是一个native方法,其实质是根据对象的内存地址计算哈希值。
以散列结构为基础的java容器中,一个对象的hashcode决定了这个对象的存放位置,而进一步通过equals方法去比较两个对象是否相等,例如在hashSet中,是不允许添加相等的对象的。如果不重写hashcode方法,equals相等两个对象一定相同,但此时hashcode却不一定相同,这就违反了一个原则: equals相等的两个对象hashcode必须相同,而后果就是在使用HashSet时, 会将两个相同的对象都添加到Set中。
hashcode不同的两个对象一定不相等,因此可以使用这个特性来提高比较的效率:先比较hashcode, 只有hashcode一样,才调用equals方法继续比较两个对象是否真的相等。
何如重写hashcode方法
参与hash值计算的元素,不应该被修改。
一旦修改了原来的元素,那么对象计算出来的hashcode就可能会是不一样的值,那么,就无法再从散列容器中取到这个对象。所以被用于计算对象hashcode的值应该是不会被修改的值,这一点要尤其注意