重写了equals方法,为什么一定要重写hashCode方法

参考了博客园:尐鱼儿:https://www.cnblogs.com/yuyu666/p/9733572.html           我只是做了个总结:

首先需要了解一大堆前提:
    1,没有重写的equals方法,和==一样,比较的是对象变量中存储的地址指针,重写的equals方法,比较的是地址指针指向的值是否一致,

        Point p1 = new Point(3, 3);
        Point p2 = new Point(5, 5);
        Point p3 = new Point(3, 3);
        System.out.println(p1.hashCode());//933699219
        System.out.println(p3.hashCode());//2084435065
        System.out.println(p1.equals(p3));//false
        //重写了equals方法和hashCode方法
        System.out.println(p1.hashCode());//1057
        System.out.println(p3.hashCode());//1057
        System.out.println(p1.equals(p3));//true


    2,hashCode方法,是使用hash算法加上地址指针生成的一个值,没有重写hashCode只能保证地址指针相同的两个对象变量的hashCode是一样的
    重写后的hashCode方法,是使用hash算法加上地址指针加上对象的属性值、生成的一个值,,重写的后的hashCode方法则可以保证即使两个对象变量的地址指针不相同,他们的属性值完全相同的hashCode也是一样的。
    3,在HashSet中不允许出现重复对象,重写的hashcode方法只在hash使用hash算法的集合:列如HashSet中才有用,
    4,在HashSet中不允许出现重复对象,元素的位置也是不确定的。在HashSet中又是怎样判定元素是否重复的呢?
        判断两个对象是否相等的规则是:
        1),判断两个对象的hashCode是否相等。
        如果不相等,认为两个对象也不相等,完毕,如果相等,转入2
        2),判断两个对象用equals运算是否相等。
        如果不相等,认为两个对象也不相等 。
        
好了根据前提:3,我们向HashSet<Point>集合中存储对象:    

        Point p1 = new Point(3, 3);
        Point p2 = new Point(5, 5);
        Point p3 = new Point(3, 3);
        Collection<Point> collection = new HashSet<Point>();
        collection.add(p1);
        collection.add(p2);
        collection.add(p3);
        collection.add(p1);
        System.out.println(collection.size());//输出2,此时p1和p3是相等的
        //未重写的equals方法和hashCode方法


        我们想要的结果是:System.out.println(collection.size());//输出 2,
        如果equals没有重写的话:System.out.println(collection.size());//输出 3 ,
        因为:上面的前提:1,所以我们重写了equals,然后测试:System.out.println(collection.size());//输出 3 ,
        为什么?原因是前提:4,所以我们需要重写hashCode方法,
        然后得到我们想要的结果:System.out.println(collection.size());//输出2,此时p1和p3是相等的

    总结:如果我们使用底层实现是hash算法的集合存储对象,为了保证对象不重复,所以需要重写equals方法后,一定重写hashCode方法!
    

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值