golangmap实现原理(golangmap底层原理)

Golang map简介

Golang中的map是一种无序的键值对集合,常用来存放键值对的数据结构,通过这种数据结构我们可以快速的定位到特定的键值对并查看或者修改值。在golang中,map是一种引用类型,它的零值为nil,它可以在声明之后使用make函数来进行初始化,并可以通过len函数获取map长度,我们可以使用delete函数来删除map中的某个元素。

Golang map的底层实现

Golang map的底层实现是一个哈希表,哈希表是根据关键码值(Key value)而直接进行访问的数据结构,也就是说,每一个键值对的键在哈希表中都需要有唯一的位置。它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做哈希表。哈希表是一种空间换时间的数据结构,相对于其它的数据结构哈希表的查找速度是相当快的,所以在很多需要访问速度较快的场合都会使用哈希表。

Golang map的哈希算法

golang map底层的哈希算法使用异或和移位等一系列的操作来完成,golang的哈希算法与Java或者Python等其他的哈希算法不同,它的实现主要包括以下四个部分。

  • 初始化,创建哈希表。
  • 计算哈希值。golang map的哈希算法采用了 MurMurHash3 算法来计算hash值,其具备读取数据的高速性,输出值分布良好等特点。
  • 计算桶的位置 index。golang map的哈希算法通过位运算来计算桶的位置,计算方法为 index=(hash&(bucketsize-1)),通过将哈希值与桶的数量减1进行位运算来计算bucket的位置。
  • 插入或修改数据到哈希表中。当哈希表需要插入或跟新元素时,golang会在bucket链的头部插入新的哈希值,并将已经存在的哈希值挂接到链表的后面。

在使用golang map的过程中,我们需要注意避免出现哈希值碰撞导致的性能问题,可以通过及时扩容来解决。golang中在map的元素数量小于等于7,且负载因子大于1时,不会发生扩容,当元素数量大于等于8时,就会出发扩容操作,为下一次扩容留下空间。

本文来自投稿,不代表亲测学习网立场,如若转载,请注明出处:https://www.qince.net/golang-2uk3.html

郑重声明:

本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,不存在任何商业目的与商业用途。 若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。

我们不承担任何技术及版权问题,且不对任何资源负法律责任。

如遇到资源无法下载,请点击这里失效报错。失效报错提交后记得查看你的留言信息,24小时之内反馈信息。

如有侵犯您的版权,请给我们私信,我们会尽快处理,并诚恳的向你道歉!

(0)
上一篇 2023年5月2日 上午2:48
下一篇 2023年5月2日 上午2:48

猜你喜欢