equals()方法比较简单,是用来比较两个对象之间是否相等。若不重新定义,其对比方式使用的是object类中的比较方法,利用两个对象是否"==",来判断。对于特殊对象,用户也可以重写此方法,定义自己的比较规则。
hashcode被叫做哈希码,也叫做散列码。hashcode()方法是定义在objcet类中的一个本地方法,作用是获取对象的哈希码。由于所有的对象都创建在内存的堆中,而堆的底层其实是维护了一张哈希表,每一个对象都有一个哈希码作为索引,使用该索引,就能够很快的找到该对象。
说人话就是,equals是创造某种方法,去比较两个对象是否相同,而hashcode是实现莫某种算法,为每个对象编号,方便查找。
两者的关系:
1.若两个对象相同,则equals比较的结果一定相同,二者也有着相同的hashcode
2.若两个对象的hashcode相同,也不能判断其equals比较的结果一定相同
hashcode好比一个带有编号的收纳盒(0 1 2 3 4 5 6),两个对象的hashcode相同(加入),说明使用某种算法后(hash码的计算方法),两个对象得到了相同的哈希码(例如都得到了0),则他们被放入了0号收纳盒。所以哈希码相同,并不能说明他们是同一个对象。
所以找到了收纳盒(hashcode)后,需要用equals方法继续判断,两个对象是否是同一个对象。
若重写了equals方法(即改变了对象的比较规则),也需要修改hashcode的计算规则(收纳盒的编号规则)。
Set和HashSet底层就是通过以上方式去查找元素的:由于set集合是无序且不重复的,所以插入元素时,会判断两个元素的hashcode是否相等,若不相等(来自不同的收纳盒),则判定为两个不同元素,可以插入,若hashcode相同,则继续通过equals方法判断,两个元素是否相同,若相同,则不插入新元素。