你真的了解hashmap吗?

来源:互联网 发布:教育行业数据分析 编辑:程序博客网 时间:2024/06/08 12:48

整理了一些关于hashmap的面试题。

为什么在链式长度为8的时候才构建红黑树

长度为8,链表转树,长度为6,树转链表。。中间有个差值,还可以防止链表和树频繁转换。假设8以上转为树,8以下转为链表,那么一个hashmap如果不停的插入删除,链表长度在8左右徘徊,就会不停的树转链表,链表转树,效率很低。

hashmap 为什么要2的n次幂长度

接下来,我们分析下为什么哈希表的容量一定要是2的整数次幂。首先,length为2的整数次幂的话,h&(length-1)就相当于对length取模,这样便保证了散列的均匀,同时也提升了效率;其次,length为2的整数次幂的话,为偶数,这样length-1为奇数,奇数的最后一位是1,这样便保证了h&(length-1)的最后一位可能为0,也可能为1(这取决于h的值),即与后的结果可能为偶数,也可能为奇数,这样便可以保证散列的均匀性,而如果length为奇数的话,很明显length-1为偶数,它的最后一位是0,这样h&(length-1)的最后一位肯定为0,即只能为偶数,这样任何hash值都只会被散列到数组的偶数下标位置上,这便浪费了近一半的空间,因此,length取2的整数次幂,是为了使不同hash值发生碰撞的概率较小,这样就能使元素在哈希表中均匀地散列。

indexFor为什么用 h & (length-1)

static int indexFor(int h, int length) { //根据hash值和数组长度算出索引值                return h & (length-1);  }

这个我们要重点说下,我们一般对哈希表的散列很自然地会想到用hash值对length取模(即除法散列法),Hashtable中也是这样实现的,这种方法基本能保证元素在哈希表中散列的比较均匀,但取模会用到除法运算,效率很低,HashMap中则通过h&(length-1)的方法来代替取模,同样实现了均匀的散列,但效率要高很多,这也是HashMap对Hashtable的一个改进。

hashmap resize为什么会造成死循环)

这里写图片描述