文章目录
- 前言
- 回答
- 了解哈希
- hashCode()
- 总结
前言
了解equals戳这里→java基础 之 equals和==的区别
请记住这句话:两个对象相同,哈希码一定相同。哈希码相同,两个对象不一定相同。
回答
- 只重写equals()方法,不重写hashCode()方法:
存在A.equals(B)为true,但是hashCode不同,在使用散列集合进行存储的时候因为hashCode不同而存储在不同的位置,造成了数据重复;- 只重写了hashCode()方法,不重写equals()方法:
当发生哈希冲突时,即使两个对象相等,但是因为内存地址不同,会将数据再次存储,造成数据重复
了解哈希
为了让对象在集合中能够更高效地进行查找和比较,我们通常需要重写对象的equals()和hashCode()方法。其中,equals()方法用于比较两个对象是否相等,而hashCode()方法则用于返回对象哈希值,供集合类使用。
- 了解哈希表、哈希码、哈希函数的关系
如上图,我们需要存储一批对象,要求:不可以重复,且可以随时获取
1、通过哈希码(hashCode)来和数组长度取余,得到数组要存放的位置
2、会出现哈希冲突,如10和40,42和92,我们是上边采用的是链式寻址法
3、出现哈希冲突后,需要使用equals来判断数值是否相等,如果相等,数据不再存入,不相等,需要采取一些措施来解决哈希冲突
hashCode()
-
定义在顶层的父类Object中,子类可以进行重写
-
是一个native方法,如果未进行重写,将内存地址转换为int数值进行返回
-
使用hashCode()方法获取到的int数值就是哈希码(散列码,如上图的10,99,89…)。哈希码的作用是确定对象在哈希表中的位置
-
哈希码的计算方式应该尽量均匀分布,这样可以提高哈希表的性能。
-
哈希码的计算过程中,应该避免使用可能会发生溢出的操作。 建议使用自动生成的hashCode()方法,例如Eclipse和IntelliJ IDEA都支持自动生成hashCode()和equals()方法的功能。
至于什么是哈希冲突,怎么解决,推荐大家一篇文章 戳这里→【基础知识】什么是哈希冲突?
总结
-
在集合中存储时直接使用equals比较不可以吗?
可以。但是在散列集合中直接比较数据对象的效率太低,时间复杂度为O(n)。重写hashCode()方法后可以快读判断两个数据对象的索引位置,时间复杂度为O(1)
-
重写了equals和hashCode方法的对象,在散列集合中存储时能保证数据的唯一性:
只重写equals方法,hashCode返回的是内存地址的int数值,会导致两个相等的对象存储在不同的位置,导致数据重复。
只重写hashCode方法,equals是使用的Object的方法,比较的是内存地址,会被认为是两个不同的数据,再次存储,导致数据重复 -
重写后:
1、hasCode()方法用来在最快时间内判断两个对象是否相等并定位索引位置。
2、可能会出现误差,这时候用equals()方法来判断两个对象是否绝对相等。
3、hashCode()用来保证性能 equals()用来保证可靠