map
mapmaphmapa headerfora go mapbmapa bucketforaGomapbucket
mapbmap
bucket:
hmapmap
hmapbucket
而bucket又是一个链表,所以,整体的结构应该是这样的:
map
Golang把求得的值按照用途一分为二:高位和低位。
hmapmap
并不是key0/value0/key1/value1的形式,这样做的好处是:在key和value的长度不同的时候,可以消除padding带来的空间浪费。
map
的扩容当以上的哈希表增长的时候,Go语言会将bucket数组的数量扩充一倍,产生一个新的bucket数组,并将旧数组的数据迁移至新数组。
加载因子
加载因子
加载因子加载因子加载因子
加载因子加载因子map加载因子
map长度 / 2^B
6.5Bmap加载因子mapoldbucket
map
map
注意:这里并不会直接删除旧的bucket,而是把原来的引用去掉,利用GC清除内存。
中数据的删除mapmap
1、如果``key``是一个指针类型的,则直接将其置为空,等待GC清除;
2、如果是值类型的,则清除相关内存。
3、同理,对``value``做相同的操作。
4、最后把key对应的高位值对应的数组index置为空。