1,HashMap的数据结构:横为数组,纵为链表。

2,HashMap的数据结构的代码体现:Entry[] (横向),Entry实例(纵向)。Entry 由key,value,hash和next(下个entry实例的索引)组成。 

3,HashMap插入数据过程:先取key的hashCode -> hash算法(各种位运算,使散列表分布更均匀)-> indexFor算出数组下标,这个计算过程中,不同的key值可能会有相同的计算结果【hash冲突】,HashMap采用数组+链表的方式解决此问题,在数组当前位置的元素(链表结构)中插入Entry。

4,HashMap取值过程:key -> hashCode -> hash -> indexFor找到数组索引,然后取数组当前位置的Entry链表,遍历Entry,equals每个key。

5,HashMap的容量:HashMap的成员变量包含:threshold(阈值)、loadFactor(负载因子)、capacity(容量)等,HashMap的容量一定是2的次幂,也就是说size扩容时是之前size的2倍,为什么是这样呢?当HashMap的size达到threshold时会自动扩容,调用resize()和transfer(),会重新调整数组和链表的数据的位置,这样数据会重新散列,消耗资源随之增加。前面提到过插入数据的过程中,计算indexFor是这样实现的:(size-1)&hash,也就是说取hash值的低位来确定数组的index,如老map的size是16,扩容至32,二进制15的表示方式为:0000,1111,31的二进制为:0001,1111,低位的index结果不会发生变化,这样老map的数据不需要重新散列,会极大减少资源的消耗。

6,重写equals要重写hashCode,这个原因也是因为计算indexFor,key对象的equals重写后比较的结果相同,如没重写hashCode(),hashCode就可能不同了,在HashMap中的index就可能不同。

posted on 2018-10-17 19:15  Frand.D  阅读(115)  评论(0编辑  收藏  举报