他们的功能和目的是不同的:
equals()是为了比较对象是否相等;
HashCode()是用来决定元素在集合中的散列位置;使用HashCode的集合有:HashTable, HashSet, HashMap。hashcode的使用使得equals()调用的次数大大减少。
以HashTable为例:
put操作时,首先调用对象的HashCode()得到其hash值,根据这个值以及hash表的长度进行取余操作得到它应该放在表中的index;
如果这个位置没有元素:作为首元素,直接放入;
如果这个位置有元素:
如果没有相等的元素,则该元素作为链表的首元素插入;
如果有相等的元素,则替换,原元素返回
get操作时:
首先调用对象的HashCode()得到其hash值,根据这个值以及hash表的长度进行取余操作得到它应该放在表中的index;
依次对链表中的各个元素,调用相应次数的equals方法,判断是否有相等元素存在,存在则返回该元素,否则返回null
可以看出,由于hashcode方法的存在,使得equals方法调用的次数大大减少;同时为了保证这种机制的正确性,我们必须保证:
相等的元素,其hashcode必须相等。
因为如果不这样做的话,首先根据hashcode得到表中的index,由于hashcode不同则得不到元素所在的index,则也找不到该元素。房间都找错了。
附言:
另外可以看出,相同hashcode的元素在同一个链表上,这个链表上的元素是不相等的;
这种链表方式解决散列冲突的方法叫做拉链法。
另外HashMap中也是一个散列表,他的特殊之处是通过key得到hashcode,而不是待存储元素本身