文章目录
前言
在idea编译器中重写equals方法和重写hashCode方法捆绑在一起,同时在学习到set集合时也常看到各种资料写着hashCode和equals方法都需要重写,这是为什么呢?
以下是我的个人理解
一、什么是hashCode?
hashCode是Object类中定义的一个方法,则任何类都继承自Object方法,常见的Integer类,String类在查看源码时发现都有重写过hashCode,而自定义类继承自Object父类的hashCode方法,Object类的hashCode方法是根据内存地址计算返回的,此时需要联系数据结构的哈希表进行联想,假设把他当做哈希表的链地址表示法的数组下标进行简化。
二、向HashSet添加数据流程
三、不重写hashCode但重写了equals怎么样
四、重写了hashCode和equals比较逻辑
总结
当没重写hashCode时,自定义类会调用父类Object的hashCode方法,父类hashCode方法是根据地址值进行运算的,重写hashCode方法后会按照内容计算得出哈希值;自定义类new出来两个对象,即使元素内容完全相同,但是地址不同计算出得哈希值不同,哈希值不同就可认为元素不同,直接加入到哈希表中,没有实现去重操作;但重写hashCode后会根据元素内容重新生成一个哈希值,不在根据地址值来进行判断,相同哈希值的元素必然会定位到同一下标位置,此时需要equals方法进行比较,在没有重写equals方法时调用的时Object类的equals方法,父类equals方法仅仅是==判断比较的是地址值,需要自己重写来判断内容,当且仅当哈希值相同且元素内容完全相同时才会进行去重,若哈希值相同但元素内容不同时仍会正常加入哈希表中。
(重写hashCode和equals方法后:哈希值不同则元素一定不同,hashCode相同equals不一定相同,equals相同hashCode一定相同)