散列、散列码、hashCode()

来源:互联网 发布:免费淘宝客网站源码 编辑:程序博客网 时间:2024/06/08 04:41

散列:

散列就是将键保存在某处,以便能很快找到。

散列码:

1、存储一组元素最快的是数组,所以用它来表示键的信息不是键本身,通过键对象生成一个数字,就是散列码,将其作为数组的下标。

2、因为不同的键可能生成相同的散列码,产生相同的下标,所以数组的大小就不重要了,任何键在数组中都有位置。

3、hashCode()生成的就是散列码

举个形象一点的例子:

一年有 365 天,从 1 编号到 365,下面我定义一种编码方法,每个人按照他生日那天的编号作为他的标识码,这样,一群人每个人就会有一个标识码。

这个标识码有什么用呢?好,下面我说,请所有单号站一起,双号站一起。此后,当我要找一个人的时候,如果知道他的编号是单号,那我只需要到单号里去找,查找效率提高了一倍。

如果我说,请编号能被 16 整除的人站到一起,被 16 除余 1 的人站到一起,被 16 除余 2 的人站到一起…… 此后,当我要找一个人的时候,查找效率就会提高到 16 倍。

这就是散列码。所以,一个好的散列码算法,配合一个适当的存储机制,就能够实现高效的存储管理。

4、从上面可以知道散列码不必唯一,但是通过hashCode()和equals()必须能完全确定对象身份。

5、综上:
HashMap查询一个值的过程为
①计算散列码;
②使用散列码查询数组;
③因为数组只是保存了值的list,所以对list中的值使用equals()进行线性查询。

所以,HashMap不是查询整个list,而是快速跳到数组的某个位置,只对很少的元素进行比较,所以查询速度快。