- 联系方式:1761430646@qq.com
- 菜狗摸索,有误勿喷,烦请联系
为什么重写 equals 时为什么一定要重写 hashCode?
-
前提:了解
HashMap
的实现原理 -
**equals方法和hashCode方法时Object类中的两个基础方法,它们共同协作来判断两个对象是否相等。**而这样设计的目的在于性能
-
在HashMap中,我们知道当我们要查询某个键值对时,通过是通过key的hashCode值传给hash()方法接着再去求得此键值对所在的桶的位置。
- 试想一下,要是没有hashCode方法,那么当我们想查某个键值对时,必须一个一个遍历HashMap中的元素,这样无疑性能很低
-
而对于比较两个对象是否相等时,我们通常先比较其hashCode值相同,如果相同的话再使用equals方法取判断是否为同一对象,如果为true,那么这两个对象就是相等的,否则其他任何情况都认为这两个对象不相等。
-
为什么不直接使用hashCode方法就确定这两个对象是否相等呢?
- 在程序的某次执行过程中,某一对象多次调用hashCode方法返回的值一定相同,而对于不同对象,通常是不同的,但是也是有机会会相同的
- 所以hashCode值相同的两个对象,实际上是有可能不同的
- 使用hashCode可以起到快速初次判断对象是否相等的作用
-
为什么不直接使用equals()方法就确定这两个对象是否相等呢?
- 对于Object类的equals方法,是去比较两个对象的地址是否相同
- 如果我们的自定义子类没有重写这个equals方法,那么我们不管实例化多少个不同的子类,他们调用equals方法都不可能返回true,因为每次实例化时,尽管其内部属性一模一样,但是还是属于指向不同的地址
- 所以自定义子类时要重写equals方法,根据我们自己的业务需求自定义如果判断什么情况时相等。
- 当自定义重写了equals方法时,我们就可以使用其两个实例对象判断是为相同了,那么其实不用hashCdoe()方法了,那么为毛还要重写hashCode方法了,其实这个问题就回到了上面的大问题上
-