面试题合集目录

map查找?

假设当前 B=4 即桶数量为2^B=16个,要从map中获取k4对应的value
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

k4的查找步骤:
①计算k4的hash值;
②通过低B位来确定在哪号桶,此时B为4,所以取k4对应哈希值的后4位,也就是0101,0101用十进制表示为5,所以在5号桶);
③根据k4对应的hash值高8位快速确定是在这个桶的哪个位置(额外说明一下,在bmap中存放了每个key对应的tophash,是key的哈希值高8位),一旦发现高8位一致,则会执行下一步;
④对比key完整的hash是否匹配,如果匹配则获取对应value;
⑤如果都没有找到,就去连接的下一个溢出桶中找。

tophash可以快速确定key是否正确,也可以把它理解成一种缓存措施,如果高8位都不对了,后面就没有必要比较了。

map的底层实现?

map是一种key-value的键值对存储结构,其中key不能重复,底层用hash表存储。
map的数据结构在源码结构中的关键字段如下,在src/runtime/map.go中:

type hmap struct {count     int // 元素的个数flags     uint8B         uint8  // buckets 数组的长度,就是 2^B 个noverflow uint16hash0     uint32buckets    unsafe.Pointer // 2^B个桶对应的数组指针oldbuckets unsafe.Pointer // 发生扩容时,记录扩容前的buckets数组指针nevacuate  uintptrextra *mapextra //用于保存溢出桶的地址
}//在编译期间的bmap结构体
type bmap struct {tophash [8]uint8 //存储哈希值的高8位data    byte[1]  //key value数据overflow *bmap   //溢出bucket的地址
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在go的map实现中,它的底层结构体是hmap,hmap里维护着若干个bucket数组 (即桶数组)。

Bucket数组中每个元素都是bmap结构,也即每个bucket(桶)都是bmap结构,每个桶中保存了8个kv对,如果8个满了,又来了一个key落在了这个桶里,会使用overflow连接下一个桶(溢出桶)。

map如何扩容?

发生扩容的条件:
B–buckets数组的长度
载荷因子(loadFactor)
loadFactor:=count / (2^B) 即 载荷因子 = map中元素的个数 / map中当前桶的个数
通过计算公式我们可以得知,载荷因子是指当前map中,每个桶中的平均元素个数。

扩容条件1:装载因子 > 6.5 (源码中定义的)

扩容条件2: 溢出桶的数量过多
当 B < 15 时,如果overflow的bucket数量超过 2^B。
当 B >= 15 时,overflow的bucket数量超过 2^15。
简单来讲,新加入key的hash值后B位都一样,使得个别桶一直在插入新数据,进而导致它的溢出桶链条越来越长。如此一来,当map在操作数据时,扫描速度就会变得很慢。及时的扩容,可以对这些元素进行重排,使元素在桶的位置更平均一些。

扩容方式:
有两种,一种是等量扩容,另一种是2倍扩容。
相同容量扩容:
由于map中不断的put和delete key,桶中可能会出现很多断断续续的空位,这些空位会导致连接的bmap溢出桶很长,导致扫描时间边长。这种扩容实际上是一种整理,把后置位的数据整理到前面。这种情况下,元素会发生重排,但不会换桶。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2倍容量扩容:
由于当前桶数组确实不够用了,发生这种扩容时,元素会重排,可能会发生桶迁移。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如图中所示,扩容前B=2,扩容后B=3,假设一元素key的hash值后三位为101,那么由上文的介绍可知,在扩容前,由hash值的后两位来决定几号桶,即 01 所以元素在1号桶。 在扩容发生后,由hash值得后三位来决定几号桶,即101所以元素会迁移到5号桶。

2023版golang面试题100道(map)相关推荐

  1. 2023版golang面试题100道(slice)

    面试题合集目录 整型切片如何初始化? s1 := make([]int, 0) s2 := make([]int, 5, 10) s3 := []int{1, 2, 3} nil切片和空切片指向的地址 ...

  2. 【JAVA Core】精品面试题100道

    [JAVA Core]精品面试题100道 加个说明:我的初心是Java每个技术栈整理个100道面试题,现在的底子是哪吒的<208道面试题> 后续我会把自己有价值的题和面试真题添加进入,也对 ...

  3. 【Redis】精品面试题100道

    [Redis]精品面试题100道 加个说明:我的初心是Java每个技术栈整理个100道面试题,现在的底子是哪吒的<208道面试题>和敖丙面试题 后续我会把自己有价值的题和面试真题添加进入, ...

  4. c语言while中100 95,C语言笔试题100道

    C语言笔试题100道 a) 30 b) 50 c) 40 d) 20 e) 10 18) #include void main() { int a=3,b=2,c=1; int x=10,y=20; ...

  5. Python经典面试题100道(附PDF下载地址)

    最近肝了一个月,整理了下经典的 Python 经典习题 100 道,有基础的,也有进阶的,用习题来巩固知识点,不枯燥,为了方便大家查阅,我把这 100 道题整理成了 PDF 文档,大家可以下载到电脑或 ...

  6. 【JAVA面试题】java面试题100道详解

    Java面试简答题100道详解 什么是Java? Java是一种高级编程语言,具有面向对象.跨平台.容易学习等特点. Java有哪些特点? Java有面向对象.跨平台.垃圾回收.安全性等特点. 说说J ...

  7. Linux面试题100道

    导读:本文整理了最新的Linux面试题,近3万字,约100道题,分享至此,希望对大家有帮助. 目录 一.Linux 概述 二.磁盘.目录.文件 三.安全 Shell 四.编程题 七.文档编辑命令 八. ...

  8. JAVA面试题100道

    1.final关键字 final修饰类,表示类不可变,不可继承,比如String,不可变性 final修饰方法,表示该方法不可重写,比如模板方法,可以固定我们的算法 final修饰变量,这个变量就是常 ...

  9. Java常见面试题-100道

    面试题 1. overload 和override的区别 ?overload的方法是否可以改变返回值的类型? Overload:重载 Override:重写 重载:同一个类中,方法名相同,参数列表不同 ...

最新文章

  1. 技术界与翻译界的交锋:机器翻译离我们还有多远? | 清华AI Time
  2. [转]文件浏览直接显示[兼容IE,FireFox]
  3. 获取本机主机名称和IP地址
  4. bilibili基于 Flink 的机器学习工作流平台在 b 站的应用
  5. Jmeter java.lang.OutOfMemoryError: GC overhead limit exceeded
  6. werkzeug local
  7. 双步位移求解特征值matlab,数值分析——带双步位移的QR分解求特征值算法
  8. 转:MSSQL SERVER行转列 列转行
  9. opengl 旋转矩阵和纹理坐标相乘_OpenGL-Rotating Points
  10. 7z解压crc错误_7-Zip - 常见问题解答(FAQ)
  11. Ubuntu 建立局域网
  12. oss批量上传工具_阿里云oss一键上传工具-阿里云OSS上传工具PC版下载V1.0最新版-西西软件下载...
  13. 数据库实验3 表、ER图、索引和视图的基础操作
  14. ubuntu邮件客户端_在Ubuntu中将Gmail设置为默认邮件客户端
  15. 计算机重启后桌面文件全部丢失,蓝屏后桌面文件丢失,电脑蓝屏桌面文件丢失...
  16. MJ对2008年10月6日大盘预测(节后第一天)
  17. python飞行棋小游戏
  18. 电脑硬盘锁怎么解除linux,电脑上的硬盘锁上了怎么删掉密码
  19. Transformer:注意力机制(attention)和自注意力机制(self-attention)的学习总结
  20. 如何利用英文翻译器在线语音翻译英文

热门文章

  1. auto.js悬浮窗按钮的实际使用
  2. 高级硬件工程师是怎样炼成的
  3. 用不惯VMware?比它更快、更轻的虚拟机,横空出世!
  4. jsTree插件简介(四)
  5. 1.python-web
  6. Android 各版本 设置 USB 默认连接 MTP 模式 ( Android 6.0+ )
  7. 谈一谈mmkv的使用
  8. java ygc逐步增加,【jvm学习笔记五】G1-YGC分析
  9. 【Niagara 04】Tridium N4使用——生成报警信息
  10. 程序员二本毕业在华为外包工作3年,晒出收入和存款,还以为看错了!