Golang-Map

数据结构:

type hmap struct {
	count     int // 当前元素的数量 == len()
	flags     uint8
	B         uint8  // 桶的log_2数量 2^B 个桶最多承载loadFactor*2^B 个元素
	noverflow uint16 // 溢出桶的数量,桶的数量少时是一个精确值,桶的数量多时是一个近似值
	hash0     uint32 // hash seed

	buckets    unsafe.Pointer //  指向 2^B 个桶的数组指针
	oldbuckets unsafe.Pointer // 当发生扩容时会指向上一个桶的数组指针
	nevacuate  uintptr        // progress counter for evacuation (buckets less than this have been evacuated)

	extra *mapextra // optional fields
}
 //在编译期间产生的结构体
 type bmap struct {
     tophash [8]uint8 //存储哈希值的高8位
     data    byte[1]  //key elem数据key/elem/key/elem/...
     overflow *bmap   //溢出bucket的地址
 }

Set/Get 操作解析

  1. key Hash计算出64位值
  2. 取低B位 计算出key 在buckets数组中对应的 bmap
  3. 取高8位校验bmap是否存在当前的key
  4. 遍历bmap + overflow找到空位进行插入(Set)/ 找到对应的key返回元素值(Get)
  5. bmap 超过8个元素会把元素插入到overflow 溢出桶里面

扩容

条件满足其一触发扩容

  1. 负载因子过大 (count/2^B)>6.5,也就是说平均每个桶的元素超过了6.5个
  2. 溢出桶数量太多 noverflow > 2^B 当B>15时 noverflow> 2^15

扩容过程

  1. oldbuckets 指针指向buckets 地址
  2. B+1
  3. 创建新的 2^B 长度 bmap 数组出来,buckets 指向数组的地址
  4. 之后的操作会优先查oldbuckets,再查 buckets,并在操作中逐渐把oldbuckets 元素插入到新的buckets中,直到 oldbuckets 变为空
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值