温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何搞懂equals和hashCode

发布时间:2021-12-09 15:45:25 阅读:108 作者:柒染 栏目:大数据
开发者测试专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

如何搞懂equals和hashCode,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

. == 和 equals的区别

==被我们常用来比较基本数据类型的值,对于比较对象时我们一般是使用equals方法的,我们知道所有的类都是继承自Object类的。其实在Object中的equals方法就是使用==来比较的。

也就是说==也是可以用来比较对象的,正如Object类中一样。但是如果用双等号比较对象,比较的是对象在内存中的地址,而不是值。所以一般在我们的业务场景中,例如:

1public class House {2    private int houseShape;// 房子户型3    pirvate long houseSize;// 房子大小4    private int houseArea; // 房子地段5    ...6}
 

例如上面一个类House.java,如果我们比较两个House相等。应该是在他的house的地段,大小,户型等等属性都相等的时候就可以认为这两间房子是等价的。
那么对于这种类型对象的比较,显然用双等号是不合适的,这时候我们应该重写equals方法:

 1public class House { 2    private int houseShape;// 房子户型 3    pirvate long houseSize;// 房子大小 4    private int houseArea; // 房子地段 5    ... 6 7    @Override 8    public boolean equals(Object obj) { 9        if (obj instanceof House) {10            House p = (House) obj;11            return this.houseShape == p.houseShap12                    && this.houseSize == p.houseSize13                    && this.houseArea == p.houseArea;14        }15        return super.equals(obj);16    }17}
   

. 重写equals就一定要重写hashCode吗?

答案是:否!

首先hashCode我们可以理解为对象的地址(根据地址生成的hash码),只要new一个对象出来,hashCode就应该不相同。一般情况下,我们确实不用管hashCode方法。但是当我们需要将对象存放入某些数据结构中时,例如HashSet,这时候当我们重写了equals就必须重写hashCode了。这是为什么呢?因为在这种数据结构中,不允许重复存储两个相等的对象,那它怎么去判断两个对象是否相同呢?有人讲,可以使用equals方法嘛,根本不需要hashCode啊!不错,使用equals方法确实可以判断。但是你想过没有,如果有几千万条数据,难道每增加一条数据就和之前的所有数据通过equals方法比较一下吗?肯定不是的,所以设计HashSet结构的大师就想到了通过对象的地址来判断,同一个地址肯定只有一个对象咯,只要有新的对象添加进来直接找到内存的对应地址上不就行了。正因为大师做了如此的巧妙的设计,所以当我们要将数据放到Hash结构的数据结构中时,就必须确保当我们使用equals判断是相等的对象,就应该拥有相同的内存地址即相同的hashCode。

反之,当equals判断为不相等的对象其hashCode也应该不相等。所以我们同时重写equals方法和hashCode方法就是为了保证这一点。

看完上述内容,你们掌握如何搞懂equals和hashCode的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

原文链接:https://my.oschina.net/u/4584967/blog/4395391

AI

开发者交流群×