hashMap总结

1.为什么hashMap的大小为2^n?

hashMap大小如果不是为2^n,在hash&(n-1)的时候就会干扰到值,

假设初始化大小为7,则hash& 6在运算的时候,6的二进制是0110

hashMap总结
如图,大小如果不是为2^n,做与运算的时候就会干扰hash得值。如果是二的幂次方,结果为0111,能保证数据不被干扰到。

2.求下标位置i = (n - 1) & hash

​ i = (n - 1) & hash等价于hash % n,因为计算机中与运算速度比%运算快, (n - 1) & hash就是保证了结果值永远在数组的范围内,不会超过数组大小
​ n是2n,则**2n-1转成二进制是0后面n个1**,保证了高位为0做&运算的时候永远是0,低位做&运算的时候看hash值。

hashMap总结

3.hash函数怎么来的?

hash函数是高16和低16为做异或运算

4.扩容根据什么来判断node在新数组位置?

hashMap总结

面试题

  1. Hash原理,内存数据结构

    ​ 底层使用哈希表(数组+链表),当链表过长试试会将链表转成红黑树来实现

  2. 讲一下hashmap的put方法过程

    ​ a 对key求hash值,然后再计算下标

    ​ b.如果没有碰撞,直接放入桶中

    ​ c.如果碰撞了,以链表方式链接到后面

    ​ d.如果链表长度超过阈值(8),就将链表转成红黑树

    ​ e.如果节点已经存在就替换旧值

    ​ f.如果桶满了(容量+加载因子),则需要扩容

  3. hashmap中hash函数怎么来的?还有哪些实现hash方式?

    a.高16bit 与低bit 做 异或

    b.(n-1)& hash 得到下标

  4. hash怎么解决冲突,讲一下扩容过程,加入一个值在原数组中,现在移动了新数据,位置肯定发生变化了,那是什么定位到这个值新数组中的位置

    a.将新节点加到链表后

    b. 容量扩容为原来的2倍,然后对每个节点重新计算哈希值

    c.这个值可能在两个地方,一个是原下标位置,另一种下标为 <原下标+原容量>的位置

  5. 抛开hashmap, hash冲突有哪些解决办法

    开放定址,莲地址法