hashMap总结
1.为什么hashMap的大小为2^n?
hashMap大小如果不是为2^n,在hash&(n-1)的时候就会干扰到值,
假设初始化大小为7,则hash& 6在运算的时候,6的二进制是0110
如图,大小如果不是为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值。
3.hash函数怎么来的?
hash函数是高16和低16为做异或运算
4.扩容根据什么来判断node在新数组位置?
面试题
-
Hash原理,内存数据结构
底层使用哈希表(数组+链表),当链表过长试试会将链表转成红黑树来实现
-
讲一下hashmap的put方法过程
a 对key求hash值,然后再计算下标
b.如果没有碰撞,直接放入桶中
c.如果碰撞了,以链表方式链接到后面
d.如果链表长度超过阈值(8),就将链表转成红黑树
e.如果节点已经存在就替换旧值
f.如果桶满了(容量+加载因子),则需要扩容
-
hashmap中hash函数怎么来的?还有哪些实现hash方式?
a.高16bit 与低bit 做 异或
b.(n-1)& hash 得到下标
-
hash怎么解决冲突,讲一下扩容过程,加入一个值在原数组中,现在移动了新数据,位置肯定发生变化了,那是什么定位到这个值新数组中的位置
a.将新节点加到链表后
b. 容量扩容为原来的2倍,然后对每个节点重新计算哈希值
c.这个值可能在两个地方,一个是原下标位置,另一种下标为 <原下标+原容量>的位置
-
抛开hashmap, hash冲突有哪些解决办法
开放定址,莲地址法