我们重写了equals方法为什么还要重写hashCode?

1.我们想想,我们重写equals方法的目的是为了什么?

2.重写了equals方法后,保证了两个对象相等,那就一定保证这两个对象的hashCode相等吗?

3.我们重写了equals方法为什么还要重写hashCode?

回答1:我们重写equals方法不就是为了保证两个对象,在某些条件都相等情况下,心里默认这两个对象是相等的。例如String,不就是值相等,我们就判断其equals相等么

回答2:重写了equals方法保证了两个对象相等,但是,hashCode不一定相等。而java里面规定,两个对象相等,那么其hashCode一定相等。所以为了这个规范,我们要重写hashCode()方法。

回答3:为了避免在equals相等的条件下,出现hashCode值不相同的情况出现。所以我们在重写equals方法的同时要重写hashCode

补充:像我们常用的hashSet,hashMap,其都是根据hashCode值来判断是否相同的。

代码示例:

定义一个EqualExample类

public class EqualExample {

    private int x;
    private int y;
    private int z;

    public EqualExample(int x,int y,int z) {
        this.x = x;
        this.y = y;
        this.z = z;
    }

    //重写了equals方法
    @Override
    public boolean equals(Object o) {

        if(this == o) return true; //检查是否是同一个对象引用
        if(o == null || getClass() != o.getClass()) {
            return false;//如果不是同一个对象的引用,我们这里判断是否是同一个类型
        }
        EqualExample that = (EqualExample) o;//进行转型
        //比较判断每个关键域是否相等
        if (x != that.x) return false;
        if (y != that.y) return false;
        return z == that.z;
    }

    //重写了hashCode方法
    @Override
    public int hashCode() {
        int result = 17;
        result = 31 * result +x;
        result = 31 * result +y;
        result = 31 * result +z;
        return result;
    }


}

定义测试类:

public class EqualsTest {

    public static void main(String[] args) {
        //新建了两个EqualExample对象,我们这里是希望这两个对象是一样的,但实际不一样
        //因为我们没有重写hashCode方法
        EqualExample e1 = new EqualExample(1,1,1);
        EqualExample e2 = new EqualExample(1,1,1);
        EqualsTest e3 = new EqualsTest();
        EqualExample e4 = new EqualExample(2,1,1);

        System.out.println(e1.equals(e1));//true,原因是同一个对象引用
        System.out.println(e1.equals(e3));//false,原因是不同类型的对象
        System.out.println(e1.equals(e4));//false,原因是x值不同
        System.out.println(e1.equals(e2));//true,原因是我们重写了equals方法

        //假定我们这里认为这两个对象是相等的,我们想将这两个对象放到hashSet中
        //没有重写hashCode之前
        /*HashSet<EqualExample> hashSet = new HashSet<>();
        hashSet.add(e1);
        hashSet.add(e2);
        System.out.println(hashSet.size());//2,原因是hashSet在add的时候,是根据HashCode来添加的,而这两个对象的hashCOde值不同,所以添加了两个
*/
        //重写了hashCode之后
        //那么如何达到我们想要的结果呢?
        //解决方法:重写hashCode方法
        HashSet<EqualExample> hashSet = new HashSet<>();
        hashSet.add(e1);
        hashSet.add(e2);
        System.out.println(hashSet.size());//1,原因是我们重写了hashCode



    }


}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值