equals方法和hashCode具体是什么?
在源码中我们可以看到,这两个方法都是Object()对象的默认方法。
hashCode()获取的是一个int值,而这个int值就可以认为是通过内存地址计算出来的一个哈希码。
equals()方法默认是使用 “==” 进行运算,那么也就是说,对比的是两个对象的地址是否相等。
为什么要重写equals()?
最简单的举例,当我们new出来两个String对象,如果只是使用默认的equals()来对比的话,那么直接就是对比的对象的内存地址,而两个对象的内存地址肯定不会一样的。
但是,这两个对象的值其实是相等的,所以需要我们重写equals()方法来直接对比这两个对象的值。
String a = new String("123");
String b = new String("123");
为什么要重写hashCode()?
我们已经知道,hashCode对比的是通过内存地址计算出来的哈希码,那么最常见的就是在HashMap集合中的使用。
hashMap集合的结构只要有基础应该都知道吧,是一个数组+链表(红黑树)的key-value结构。
当put()存入一条数据的时候,肯定是要先通过key来判断当前数组中是否有相同的值存在了,如果有的话就要覆盖掉。那么这个链表是怎么来的呢?
这个数组就我们可以先认为是一个hash表,当put一个数据的时候,首先会判断两个key的hashCode码是否相等(这里就是通过两个数据的内存地址计算出来hashCode),如果两个内存地址算出来的hashCode差别比较小,那么计算出的数组下标就可能会在同一个位置,需要判断两个对象的值是否相等。
那么在这里我们已经知道了HashMap使用了hashCode()方法,如果存入上面例子中的两个String对象的话,他们的值相等但是内存地址不相等,所以
hashCode就有可能也不相等,于是就可能会把这两个对象分别放入不同的数组下标中,他们就碰不到了。那不就出问题了吗。
所以hashCode()也是要重写的,要保证两个对象值相等的话,hashCode一定相等。