在上一篇初步学习了Hash算法后,我又马不停蹄地想看看HashMap到底是怎么实现的!
1.HashMap的数据结构
在java中,最基本的结构就两种,一个是数组,一个是模拟的指针,即引用;HashMap就是由这两者共同创造出来的,具体可以看下图:
我们可以知道HashMap初始化的时候就会创建一个数组,这些数组存的全是根据Key的哈希算法后的值,根据这些值找到对应位置,然后再根据key的equals函数,就可以
取出value了。这种结构在数据结构中成为链式散列。(小知识,其实ArrayList也就是对Object[ ] 进行了封装)。
2. java中hashMap的哈希算法
我们首先想到的就是取mod算法,这样分配比较平均,但是这个算法效率不算高。java中是这样做的,把数组的长度值-1,然后和key的hashcode值做一次位与运算。
注意,我们在初始化hashMap的时候,最好指定初始大小为2的n次方,这样哈希算法的效率是最高的,具体不详细叙述。当然,如果你不指定,java中也是默认会指定为16个大小的。
如果你new HashMap(1000),那么java自动会初始化为1024大小。另外如果你存的值越来越多,比如存到了16*0.75=12个时候,hashmap数组的容量就会扩展到32,这就是hashmap的resize机制。