go map底层

实现

map底层为哈希表,采用拉链法解决哈希冲突,主要出现的结构体有两个,一个叫hmap,一个叫bucket(bmap)
Golang的map中用于存储的结构是bucket数组。

hmap和bucket的关系是这样的
在这里插入图片描述
而bucket又是一个链表,所以,整体的结构应该是这样的:
在这里插入图片描述

go中数据经过hash后,得到一个hash值,Gol会把hash值分为高位和低位,低位用于寻找当前key属于hmap中的哪个bucket,高位用于寻找bucket中的哪个key。
在这里插入图片描述

搬迁

当hash 中数据链太长,或者空的bucket 太多时,会操作数据搬迁,将数据挪到一个新的bucket 上,就的bucket数组成为了oldbuckets。bucket的搬迁不是一次就搬完的,是访问到对应的bucket时才可能会触发搬迁操作

扩容

会创建一个大一倍的bucket数组,并旧数组的数据迁移至新数组。
触发条件:每个哈希表的都会有一个加载因子,数值超过加载因子就会为哈希表扩容。
加载因子:加载因子是一个阈值,一般表示为:散列包含的元素数 除以 位置总数。是一种“产生冲突机会”和“空间使用”的平衡与折中:加载因子越小,说明空间空置率高,空间使用率小,但是加载因子越大,说明空间利用率上去了,但是“产生冲突机会”高了。公式是:map长度 / 2^B(这是代表bmap数组的长度,B是取的低位的位数),阈值是6.5。其中B可以理解为已扩容的次数。

线程安全吗?

无锁!不安全!!
在Go1.9之后,引入了sync.Map,并发安全的map

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值