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在新数组位置?

在这里插入图片描述

面试题
  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冲突有哪些解决办法

    开放定址,莲地址法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值