golang map

本文详细探讨了Go语言runtime/map.go中基于哈希表的实现,包括底层结构、hash冲突处理(链地址法)、扩容策略(双倍/等量扩容)、无序性、非线程安全以及value的不可寻址原因。
摘要由CSDN通过智能技术生成

1.底层实现
2.如何解决hash冲突
3.扩容机制
4.无序
5.非线程安全
6.不可寻址

runtime/map.go

1.底层实现
底层基于hash表实现,实现有2个结构体hmap,bmap,map由若干个桶存储,每个桶存8个元素,使用链地址解决hash冲突

2.如何解决hash冲突
链地址法
当key定位到的桶已经填满8个元素,会创建一个溢出桶,将溢出桶插入当前桶的链表尾部

3.扩容机制
扩容条件
1.超过负载
map元素个数 > 6.5*桶个数,即平均每个bucket存储的键值对达到6.5个
2.溢出桶太多
没有超过负载因子,但是溢出桶太多
当桶总数 < 2^15, 如果溢出桶总数>=桶总数,则认为溢出桶过多
当桶总数>=2^15 如果溢出桶总数>=2^15 ,则认为溢出桶过多

扩容机制:
1.双倍扩容
新建一个桶数组,个数是原来的2倍,然后把旧桶的数据迁移到新桶
2.等量扩容
并不扩大容量,桶的数量保持不变,只是把旧桶的数据重新排列一次,使得同个桶的key排列更紧密,节省空间。

4.无序
(1)map在遍历时,不是固定从0号桶开始遍历,每次遍历都会随机选一个桶
(2)map扩容会发生key迁移,导致顺序变化
如何保证有序,先对key排序,再按key遍历map

5.非线程安全
没有加锁

6.不可寻址
map的value不可寻址原因
1.map底层是基于哈希表实现,也就是数组+链表,本身不可寻址
2.map扩容会导致key,value发生迁移

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值