我们知道Java中的Collection分为List和Set。List中的元素是有序和可重复的,而Set中的元素无序且不可重复。
由于Set中的元素是不可重复的,在每次向一个Set中插入新的元素时,如果没有hashCode,就需要遍历整个集合检查是否已经存在该元素。这样会使Set的效率非常低下。
使用哈希算法可以提高从元素集合中查找一个元素的效率。根据集合元素的hashCode来将元素划分成几组,每一组对应一块存储区域。根据元素的hashCode可以找到该元素的存储区域。
首先我们必须保证如果两个元素相同(equals),它们的hashCode必定相同。
向一个Set集合插入新元素时,要通过元素的hashCode来确定这个元素存放的位置。如果这个位置上没有元素,就直接存储在这个位置上,否则就散列到其他地址。
因此在插入新元素时,我们只需与根据hashCode找到的存储区域中的元素进行对比。这样提高了Set插入元素的效率。
我们在重写对象的equals方法时,必须重写hashCode。
不使用Set的时候,大部分情况下我们并不需要关注hashCode。但是我们没有理由不去重写它。
因为如果使用到了Set,在使用equals方法时,我们是使用hashCode来找到对应的存储区域,然后再存储区域中查找和对比。如果两个元素的hashCode不同,它们很可能存储在了不同的区域上,这样它们就永远不可能相等了。