重写equals必须重写hashcode方法

为什么重写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的值应该是不会被修改的值,这一点要尤其注意

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值