当前位置: 首页 > news >正文

golang map

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发生迁移

http://www.lryc.cn/news/333737.html

相关文章:

  • 设计模式:享元模式案例
  • pandas(day5)
  • 如何注册midjourney账号
  • 探索数据结构:特殊的双向队列
  • 16_I2C库函数
  • 十八、Rust gRPC 多 proto 演示
  • 【Linux】Linux64位环境下编译32位报错skipping incompatible的解决办法
  • vue指令v-model
  • CentOS安装MySQL数据库
  • 从B2B转向B2B2C模式:工业品牌史丹利百得的转型历程
  • Redis群集模式和rsync远程同步
  • JAVA—抽象—定义抽象类Converter及其子类WeightConverter
  • 面对复杂多变的网络攻击,企业应如何守护网络安全
  • 计算机网络练习-计算机网络概述与性能指标
  • vite vue3 ts import.meta在vscode中报错
  • Java synchronized(详细)
  • 算法设计与分析实验报告python实现(排序算法、三壶谜题、交替放置的碟子、带锁的门)
  • 实训问题总结——ajax用get可以成功调用controller方法,用POST就出404错误
  • 1、认识MySQL存储引擎吗?
  • 微信小程序媒体查询
  • 前端(动态雪景背景+动态蝴蝶)
  • 软考-系统集成项目管理中级-新一代信息技术
  • 【卷积神经网络进展】
  • yarn的安装和使用
  • Golang | Leetcode Golang题解之第10题正则表达式匹配
  • 【Leetcode】top 100 图论
  • 【沈阳航空航天大学】 <C++ 类与对象计分作业>
  • Vue3 自定义指令Custom Directives
  • 蓝桥杯 【日期统计】【01串的熵】
  • CSP201409T5拼图