关于hashCode和equals

在Object类中,有hashCode()和equals()方法,而任何类都是Object的子类,同样也继承了这两个方法。

调用hashCode方法得到一个Int类型的哈希码,这个哈希码的作用是确定该对象在哈希表中的索引位置。而equals是比较两个对象的地址是否相等。顺便提一下,基本数据类型是存在虚拟机栈中的局部变量表里面,而对象存在堆中。

基本数据类型中Int、String、Double...都覆写了equals方法,目的是为了比较两个对象的内容是否相等,所以这些数据类型比较的是内容,不同于没覆写equals的对象比较两个对象的内存地址。

那么hashCode和equals的区别在于,hashCode得到的是一个Int类型的哈希码,而equals得到的是两个对象地址比较的Boolean值。

那么hashCode和equals又有什么联系呢?

其实一般情况下都不会有什么联系,hashCode得到一个Int值,equals得到一个Boolean值,两个不同类型的值一般情况下都不会有联系。

那么什么情况下才有联系呢?

当我们在使用HashMap、HashSet...散列表时(存储对象的集合,涉及到hashCode,附上HashMap的源码解析),存储需要用到hashCode去做索引。

在散列表中,比较两个对象是否相等,首先判断两个对象的hashCode是否相等,如果相等,那么继续判断两个对象的内容是否相等,如果对象不相等,那么就equals为false。

所以得到一个结论:两个对象相等时,hashCode一定相等;hashCode相等,两个对象不一定相等。

有了上面的理解,再来看看重写equals方法时为什么要重写hashCode方法?

在散列表中,如果重写equals方法,为了比较两个对象是否相等而不是内存地址,则必须重写hashCode方法。不重写hashCode方法会导致两个对象内容相等,但是hashCode不相等的情况,由于散列表中先比较hashCode在比较内容,当hashCode不相等时,两个对象必定不相等。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容