散列:
散列就是将键保存在某处,以便能很快找到。
散列码:
1、存储一组元素最快的是数组,所以用它来表示键的信息,不是键本身,通过键对象生成一个数字,就是散列码,将其作为数组的下标。
2、因为不同的键可能生成相同的散列码,产生相同的下标,所以数组的大小就不重要了,任何键在数组中都有位置。
3、hashCode()生成的就是散列码。
举个形象一点的例子:
一年有 365 天,从 1 编号到 365,下面我定义一种编码方法,每个人按照他生日那天的编号作为他的标识码,这样,一群人每个人就会有一个标识码。
这个标识码有什么用呢?好,下面我说,请所有单号站一起,双号站一起。此后,当我要找一个人的时候,如果知道他的编号是单号,那我只需要到单号里去找,查找效率提高了一倍。
如果我说,请编号能被 16 整除的人站到一起,被 16 除余 1 的人站到一起,被 16 除余 2 的人站到一起…… 此后,当我要找一个人的时候,查找效率就会提高到 16 倍。
这就是散列码。所以,一个好的散列码算法,配合一个适当的存储机制,就能够实现高效的存储管理。
4、从上面可以知道散列码不必唯一,但是通过hashCode()和equals()必须能完全确定对象身份。
5、综上:
HashMap查询一个值的过程为:
①计算散列码;
②使用散列码查询数组;
③因为数组只是保存了值的list,所以对list中的值使用equals()进行线性查询。
所以,HashMap不是查询整个list,而是快速跳到数组的某个位置,只对很少的元素进行比较,所以查询速度快。