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

map原理

 map源码结构体:

 type hmap struct {count     int    // 元素的个数B         uint8  // buckets 数组的长度就是 2^B 个overflow uint16 // 溢出桶的数量​buckets    unsafe.Pointer // 2^B个桶对应的数组指针oldbuckets unsafe.Pointer  // 发生扩容时,记录扩容前的buckets数组指针​extra *mapextra //用于保存溢出桶的地址}​type mapextra struct {overflow    *[]*bmapoldoverflow *[]*bmap​nextOverflow *bmap}​type bmap struct {tophash [bucketCnt]uint8}​//在编译期间会产生新的结构体type bmap struct {tophash [8]uint8 //存储哈希值的高8位data    byte[1]  //key value数据:key/key/key/.../value/value/value...overflow *bmap   //溢出bucket的地址}

 

map: bucket中每个元素都是bmap结构,每个bmap保存8个kv键值对,如果8个满了,又来了一个key落在了这个桶里,会使用overflow连接下一个桶。

扩容:

一种是等量扩容 ,一种是增量扩容。

一.等量扩容。

条件:

B:2^B表示bucket的数量, B表示取hash后多少位来做bucket的分组。

1. B> 15时,以15计算,如果overflow的bucket数量超过2^15

2.B<15时,以B计算,如果overflow的bucket数量超过2^B

扩容结果:新建等量大小的map,将旧数据挪过去,元素会发生重排,使数据更加紧凑。

二:增量扩容。

条件: 

装载因子 > 6.5 

装载因子是指当前map中,每个桶中的平均元素个数。

即: 装载因子 =map元素个数/map当前桶个数

扩容结果:2倍的容量扩容(元素会重排,发生渐进式迁移数据)


map是线程安全的吗?
答:map不是线程安全的,在对map进行插入、删除、循环遍历的时候只要触发写的操作,就会出现painc异常。但sync.Map是线程安全的。

map是无序的还是有序的,为什么?如何有序输出map?
答:map是无序的。因为map在遍历的时候会先随机生成一个数值。根据这个数值来决定从哪个bucket开始遍历,从bucket的哪个cell开始遍历。因此map不会有序。将map中的key取出来进行排序,然后按照key的顺序进行取值即可有序的输出map。

slice 和 map 分别作为函数参数时有什么区别?
答:makeslice时返回的是一个原类型的slice,而makemap时返回的是一个指针类型的map。因此slice作为参数时,拷贝的是slice的一个副本。map作为参数时,拷贝的时map的地址。当函数内部对map进行修改时也会影响到函数外map的内部值,即使触发了扩容机制也一样。

相关文章:

map原理

map源码结构体&#xff1a; type hmap struct {count int // 元素的个数B uint8 // buckets 数组的长度就是 2^B 个overflow uint16 // 溢出桶的数量​buckets unsafe.Pointer // 2^B个桶对应的数组指针oldbuckets unsafe.Pointer // 发生扩容时&#xff0…...

[Ext JS]3.6 Ext JS 表格(Grid)概览

Grid, 翻译过来是网格, 也就是表格。 Grid 的基本构成 面板 :Ext.grid.Panel表格视图 :Ext.view.Table。 不直接使用, 通过面板的viewConfig配置项进行配置。比如可以用来配置表格中行是否跳色显示列: Ext.grid.column.Column。 表格中的列定义store , 表格的数据示例代码…...

关于使用云渲染的五大优势

在不影响质量或性能的情况下节省时间、金钱和资源&#xff0c;对于需要在通常较短且严格的期限内创建高质量 3D 内容的专业人士来说&#xff0c;云渲染都是最好的选择&#xff01;云渲染作为数字媒体生产的最新趋势&#xff0c;与传统的渲染农场和机器相比具有许多优势&#xf…...

CSS基础样式

1.高度和宽度 .c1{height:300px;width:500px; } 注意事项&#xff1a; 宽度&#xff0c;支持百分比 行内标签&#xff1a;默认无效 块级标签&#xff1a;默认有效&#xff08;右侧区域就算是空白&#xff0c;也不给占用&#xff09; 2.块级和行内标签 css样式&#xff1a;标签…...

第03章_流程控制语句

第03章_流程控制语句 讲师&#xff1a;尚硅谷-宋红康&#xff08;江湖人称&#xff1a;康师傅&#xff09; 官网&#xff1a;http://www.atguigu.com 本章专题与脉络 流程控制语句是用来控制程序中各语句执行顺序的语句&#xff0c;可以把语句组合成能完成一定功能的小逻辑模…...

配电网电压调节及通信联系研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

stegano(图片隐写、摩斯密码)

附件是PDF&#xff0c;我们在选择内容时发现光标溢出了文本 说明这里还存在一些我们看不到的内容 直接CtrlA全选&#xff0c;CtrlC复制后新建一个纯文本文件 将复制的东西粘贴过去 粘贴后发现果然多出来了一些东西&#xff0c;提取出来 BABA BBB BA BBA ABA AB B AAB ABAA A…...

wsl安装torch_geometric

在官网选择需要的版本 选择安装途径&#xff0c;选择runfile 执行第一行&#xff0c;会下载一个文件到目录下 需要降低C的版本&#xff0c;否则 执行sudo sh cuda_11.1.0_455.23.05_linux.run,会出现 查看对应的文件&#xff0c;会有 可以加上override参数之后&#xff0c;…...

ASP.NET Core - 依赖注入(二)

2&#xff0c;NET Core 依赖注入的基本用法 话接上篇&#xff0c;这一章介绍 .NET Core 框架自带的轻量级 Ioc 容器下服务使用的一些知识点&#xff0c;大家可以先看看上一篇文章 [ASP.NET Core - 依赖注入(一)] 2.3 服务解析 通过 IServiceCollection 注册了服务之后&#xf…...

Scala之集合(1)

目录 ​​​​​​​集合介绍&#xff1a; 不可变集合继承图&#xff1a;​编辑 可变集合继承图 数组&#xff1a; 不可变数组&#xff1a; 样例代码&#xff1a; 遍历集合的方法&#xff1a; 1.for循环 2.迭代器 3.转换成List列表&#xff1a; 4.使用foreach()函数&a…...

公网使用SSH远程登录macOS服务器【内网穿透】

文章目录前言1. macOS打开远程登录2. 局域网内测试ssh远程3. 公网ssh远程连接macOS3.1 macOS安装配置cpolar3.2 获取ssh隧道公网地址3.3 测试公网ssh远程连接macOS4. 配置公网固定TCP地址4.1 保留一个固定TCP端口地址4.2 配置固定TCP端口地址5. 使用固定TCP端口地址ssh远程前言…...

PVE相关的各种一键脚本(一键安装PVE)(一键开设KVM虚拟化的NAT服务器-自带内外网端口转发)

PVE 原始仓库&#xff1a;https://github.com/spiritLHLS/pve 前言 建议debian在使用前尽量使用最新的系统 非debian11可使用 debian一键升级 来升级系统 当然不使用最新的debian系统也没问题&#xff0c;只不过得不到官方支持 请确保使用前机器可以重装系统&#xff0c;…...

CSDN目录博客(zhaoshuangjian)

总目录 一、Java1.1 高并发1.2 多线程1.3 集合1.4 I/O1.5 异常1.6 事务1.7 锁机制1.8 JVM 二、数据库2.1 mysql2.1.1 mysql索引2.1.1 mysql锁2.1.1 mysql事务2.1.1 2.2 oracle2.3 postgresql2.4 达梦2.5 人大金仓kingbase 三、设计模式四、中间件4.1 缓存中间件-redis4.2 缓存中…...

uniapp人脸识别解决方案

APP端&#xff1a; 因为APP端无法使用uni的camera组件&#xff0c;最开始考虑使用内嵌webview的方式&#xff0c;通过原生dom调用video渲染画面然后通过canvas截图。但是此方案兼容性在ios几乎为0&#xff0c;如果app只考虑安卓端的话可以采用此方案。后面又想用live-pusher组件…...

hashlib模块

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起探讨和分享Linux C/C/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 hashlib模块专栏&#xff1a;《python从入门到实战》 哈希算法&#xff0c;也叫摘要算法。 加密&…...

NC65合并报表如何取消上报并退回以及注意事项和相关问题总结

NC65合并报表如何取消上报并退回&#xff1f; 在【企业绩效管理】-【合并报表】-【合并】-【合并执行】节点中&#xff0c;点击〖数据中心〗按钮&#xff0c;在弹出的〖合并报表数据中心〗界面中&#xff0c;点击〖报送管理〗-〖合并方案请求退回〗&#xff0c;然后到【合并综…...

28岁,终于从字节退休了...

大厂一直是每个程序员都向往职业目标&#xff0c;大厂意味着薪资高、福利好、倍有面儿&#xff0c;而且发展空间也大。甚至有人调侃不想进大厂的程序员不是好程序员。 而在网上&#xff0c;也有各个网友分享自己在大厂的经历&#xff0c;在某平台还有一个近2600万浏览的话题&a…...

数据的表示和存储——

目录 浮点数的编码表示 浮点数类型 ​编辑 浮点数的表示 &#xff08;1&#xff09;浮点数&#xff08;Float Point&#xff09;的表示范围 &#xff08;2&#xff09;规格化数形式 &#xff08;3&#xff09;IEEE 754标准 其他形式的机器数表示 个人总结 浮点数的编码表…...

springboot零基础到项目实战

推荐教程&#xff1a; springboot零基础到项目实战 SpringBoot这门技术课程所包含的技术点其实并不是很多&#xff0c;但是围绕着SpringBoot的周边知识&#xff0c;也就是SpringBoot整合其他技术&#xff0c;这样的知识量很大&#xff0c;例如SpringBoot整合MyBatis等等。因此…...

自媒体都在用的5个素材网站,视频、音效、图片全部免费下载~

推荐几个自媒体必备的素材库&#xff0c;免费可商用&#xff0c;建议收藏&#xff01; 1、菜鸟图库 视频素材下载_mp4视频大全 - 菜鸟图库 国内超大的素材库&#xff0c;在这里你可以找到设计、办公、图片、视频、音频等各种素材。视频素材就有上千个&#xff0c;全部都很高清…...

3分钟快速找回:手机号查QQ号Python工具完整指南

3分钟快速找回&#xff1a;手机号查QQ号Python工具完整指南 【免费下载链接】phone2qq 项目地址: https://gitcode.com/gh_mirrors/ph/phone2qq 你是否曾因为忘记QQ号而无法登录&#xff1f;或者换了新手机后&#xff0c;只记得手机号却找不到对应的QQ账号&#xff1f;…...

操作插件方法

事件触发时机事务状态适用场景beforeExecuteOperationTransaction操作校验通过后&#xff0c;开启事务之前事务未开启✅ 修改源单据关联的其他单据beginOperationTransaction开启事务后&#xff0c;提交数据库之前事务已开启修改当前操作的单据自身数据...

数据结构:2.时间复杂的和空间复杂度

【目标】1.如何衡量一个算法的好坏2.复杂度3.算法效率1.如何衡量一个算法的好坏&#xff1f;1.1 两大核心指标&#xff08;理论层面&#xff09;指标问的问题表示法例子时间复杂度数据量增大&#xff0c;耗时怎么增长&#xff1f;大O表示法O(n) 比 O(n) 好空间复杂度数据量增大…...

避坑指南:在Docker里部署OpenWrt做软路由,这几个macvlan和网络配置的坑你别踩

DockerOpenWrt软路由避坑实战&#xff1a;macvlan网络疑难解析与高阶配置 当你在双网口服务器上尝试用Docker部署OpenWrt软路由时&#xff0c;是否经历过这样的绝望时刻&#xff1a;所有配置看似正确&#xff0c;但客户端设备就是无法上网&#xff1b;宿主机与容器仿佛身处平行…...

嵌入式开发调试实战:从内存泄漏到死锁的排查技巧与工具链

1. 项目概述&#xff1a;嵌入式开发的“捉虫”艺术干了十几年嵌入式&#xff0c;从8位单片机玩到多核ARM Cortex-A&#xff0c;从裸机撸到RTOS&#xff0c;我最大的感受就是&#xff1a;嵌入式开发&#xff0c;七分在调试&#xff0c;三分在写码。你代码写得再漂亮&#xff0c;…...

从LVGL官方例程到自定义界面:在Windows上用CodeBlocks模拟器快速玩转GUI设计

从LVGL官方例程到自定义界面&#xff1a;在Windows上用CodeBlocks模拟器快速玩转GUI设计 对于嵌入式开发者而言&#xff0c;图形用户界面(GUI)设计往往需要在硬件平台上反复烧录测试&#xff0c;效率低下。而LVGL模拟器配合CodeBlocks的组合&#xff0c;为开发者提供了一个在PC…...

5分钟快速上手Vue FastAPI Admin:现代化前后端分离管理平台完整指南

5分钟快速上手Vue FastAPI Admin&#xff1a;现代化前后端分离管理平台完整指南 【免费下载链接】vue-fastapi-admin ⭐️ 基于 FastAPIVue3Naive UI 的现代化轻量管理平台 A modern and lightweight management platform based on FastAPI, Vue3, and Naive UI. 项目地址: h…...

深度神经网络(DNN)百科全书从“深“到“无限深“

一、开篇:深度的奇迹 2012 年 9 月 30 日。 ImageNet 挑战赛的结果在 Florence 公布。所有人都以为冠军会延续过去 3 年的传统——传统计算机视觉方法(SIFT、HOG、SVM)小幅领先。 但那一年,一个叫 AlexNet 的"怪物"出现了。8 层的卷积神经网络,Top-5 错误率 …...

别再手动复制粘贴了!用poi-tl + Spring Boot自动生成带表格、二维码的Word领料单(附完整源码)

基于poi-tl的Spring Boot领料单自动化生成实战指南 在企业日常运营中&#xff0c;领料单这类标准化文档的生成往往占据大量重复性工作时间。传统的手工复制粘贴不仅效率低下&#xff0c;还容易出错。本文将介绍如何利用poi-tl这一强大的Word模板引擎&#xff0c;结合Spring Bo…...

Armbian编译避坑指南:如何绕过‘Docker不可用’及国内网络依赖问题,成功构建RK3588固件

Armbian编译实战&#xff1a;RK3588平台高效构建与网络优化策略 当国内开发者尝试为RK3588这类高性能ARM平台定制Armbian系统时&#xff0c;往往会遇到两个"拦路虎"&#xff1a;Docker环境配置报错和海外资源下载困难。本文将以Rock 5B开发板为例&#xff0c;通过全本…...