课程章节:4-6 map为什么要扩容
课程讲师:Moody
课程内容:
map为什么要扩容
△ 当哈希碰撞较为厉害,溢出桶过多,导致性能严重下降
△ runtime.mapassign()方法里,通过tooManyOverflowBuckets || overLoadFactor 判断是否需要扩容
△装载因子超过6.5
--------LoadFactor(负载因子)= hash表中已存储的键值对的总数量/hash桶的个数(即hmap结构中buckets数组的个数)
--------这个数据是实际测出来的,具体参考官方文档,或者读map.go代码的注释
△使用了太多的溢出桶
扩容过程
growing()方法
①创建一个组新的桶
②oldbuckets指针指向旧的那一组桶的数据
③buckets指向新的这一组桶
④map标记为扩容状态
evacuated()方法⑤把旧数据驱逐到新的桶里
△采用的是渐进式的驱逐方式,每一次操作一个旧桶的时候,就把数据驱逐到新桶里
△读取的时候是不进行驱逐的,只判断新桶还是旧桶
⑥驱逐所有数据后,对oldbuckets进行回收
注意:扩容并非是真的需要扩容,有可能是旧数据删除了很多,桶变得不平均,有的hash多,有的hash少,所以对桶进行了整理
课程收获:学习了map的扩容机制