两个对象的hashCode()相同,则equals()也一定为true,对吗?
不对!
首要问题,理解hashCode
hashCode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值
以向HashSet中存入一个对象为例:当存入一个元素时,会想调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据此hashCode决定该对象在HashSet(元素不可重复,无序)中的存储位置。如果有两个元素通过equals()方法得到true,但两个对象的hashCode并不相同,但HashSet依然可以存储这两个对象,只是存储位置不同。
由此可知:HashSet判断两个对象相同的标准是equals()比较相等,且两个对象的hashCode也相等。
上一篇也提到,equals()方法是经常发生重写的,hashCode()方法也是,为此可以重写两种方法来保证当equals()方法返回true时,hashCode()得到的hashCode也相等。
emmm 其实写到这里我也有点疑惑,为什么有equals()方法之后,为什么还要用hashCode()呢?
为此我看了一个大佬的博客:equals()方法经常进行重写,变得复杂起来,导致了效率较低。而hashCode()可以直接得到对象的hashCode值(是不是可以理解为对象的物理存储地址)进行比较。使用hashCode()出现了一个问题,这个方法并不能保证所得hashCode不相同,即不同的对象所得到的hashCode可能相同(这与得到hashCode的算法有关,这里不加赘述),这就很尴尬了,但是!它可以保证如果两个对象的hashCode不同,则这两个对象肯定不同。
从这可以看出比较两个对象是否相同的过程:
1.使用hashCode()来对比,如果两个对象的hashCode不相同,则这两个对象肯定不同;
2.如果两个对象的hashCode相同,则使用equals()对比,如果返回false,则这两个对象不同;
3.如果使用equals()返回true,则这两个对象相同。
这样就保证了两个对象的绝对相同。
其实hashCode所涉及的东西很多,在以后会进行更多的探讨。