equals和hashcode是基类object类中所定义的两个方法,equals方法用于判断两个对象是否相等,hashcode方法则是返回对象的哈希值(根据对象的信息计算出的一个散列值,默认情况下是根据对象的内存地址)。
object类中定义的原生的equals方法是直接比较两个对象的内存地址,若是相同即返回true,不同即返回false。但在我们平常的使用中,比较两个对象是否相同,更多是比较其属性。这时候我们就会重写equals方法。
那为什么在重写equals方法的同时必须重写hashcode方法呢,这主要是因为该方法在一些散列集合:HashTable、HashMap等中会用到,当将一个元素插入到散列集合中时,会先判断该元素是否存在,遍历整个表来对比会导致效率低下,故一般使用hashcode方法获得对象的哈希值,然后取模获得该元素对应的位置,若散列集合中该位置为空,则认为该集合中不含相同的元素,直接将元素插入在对应位置即可,若是对应位置不为空,再调用equals方法进行对比,相同的话无需再插入,不同的话散列在其他位置即可。通过该方法可以大大降低插入元素时进行比较的次数。
若是仅仅重写了equals方法而没有重写对应hashcode方法,会导致使用equals判断相等的元素,其哈希值是不一样的。因为散列集合时根据对象的哈希值来确定位置的,这会导致在使用散列集合存储对象时出现问题:即两个完全相同的对象,却拥有不同的哈希值,被存放在散列表不同的位置,在实际应用中可能会发生一些无法预测的问题。
故重写equals方法的同时必须重写hashcode方法。