千家信息网

如何进行C#中Dictionary的内部实现分析

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,本篇文章为大家展示了如何进行C#中Dictionary的内部实现分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。了解Dictionary的开发人员都了解,和
千家信息网最后更新 2026年10月31日如何进行C#中Dictionary的内部实现分析

本篇文章为大家展示了如何进行C#中Dictionary的内部实现分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

了解Dictionary的开发人员都了解,和List相比,字典添加会慢,但是查找会比较快,那么Dictionary是如何实现的呢?

Dictionary的构造

下面的代码我看看Dictionary在构造时都做了什么:

private void Initialize(int capacity)
{
int prime = HashHelpers.GetPrime(capacity);
this.buckets = new int[prime];
for (int i = 0; i < this.buckets.Length; i++)
{
this.buckets[i] = -1;
}
this.entries = new Entry[prime];
this.freeList = -1;
}

我们看到,Dictionary在构造的时候做了以下几件事:

  1. 初始化一个this.buckets = new int[prime]

  2. 初始化一个this.entries = new Entry[prime]

  3. Bucket和entries的容量都为大于字典容量的一个最小的质数

其中this.buckets主要用来进行Hash碰撞,this.entries用来存储字典的内容,并且标识下一个元素的位置。

我们以Dictionary 为例,来展示一下Dictionary如何添加元素:

首先,我们构造一个:

Dictionary test = new Dictionary(6);

初始化后:

添加元素时,集合内部Bucket和entries的变化

Test.Add(4,"4″)后:

根据Hash算法: 4.GetHashCode()%7= 4,因此碰撞到buckets中下标为4的槽上,此时由于Count为0,因此元素放在Entries中第0个元素上,添加后Count变为1

Test.Add(11,"11″)

根据Hash算法 11.GetHashCode()%7=4,因此再次碰撞到Buckets中下标为4的槽上,由于此槽上的值已经不为-1,此时Count=1,因此把这 个新加的元素放到entries中下标为1的数组中,并且让Buckets槽指向下标为1的entries中,下标为1的entry之下下标为0的 entries。

Test.Add(18,"18″)

我们添加18,让HashCode再次碰撞到Buckets中下标为4的槽上,这个时候新元素添加到count+1的位置,并且Bucket槽指向 新元素,新元素的Next指向Entries中下标为1的元素。此时你会发现所有hashcode相同的元素都形成了一个链表,如果元素碰撞次数越多,链 表越长。所花费的时间也相对较多。

Test.Add(19,"19″)

再次添加元素19,此时Hash碰撞到另外一个槽上,但是元素仍然添加到count+1的位置。

删除元素时集合内部的变化

Test.Remove(4)

我们删除元素时,通过一次碰撞,并且沿着链表寻找3次,找到key为4的元素所在的位置,删除当前元素。并且把FreeList的位置指向当前删除元素的位置,FreeCount置为1

Test.Remove(18)

删除Key为18的元素,仍然通过一次碰撞,并且沿着链表寻找2次,找到当前元素,删除当前元素,并且让FreeList指向当前元素,当前元素的Next指向上一个FreeList元素。

此时你会发现FreeList指向了一个链表,链表里面不包含任何元素,FreeCount表示不包含元素的链表的长度。

Test.Add(20,"20″)

再添加一个元素,此时由于FreeList链表不为空,因此字典会优先添加到FreeList链表所指向的位置,添加后FreeCount减1,FreeList链表长度变为1

通过以上试验,我们可以发现Dictionary在添加,删除元素按照如下方法进行:

  1. 通过Hash算法来碰撞到指定的Bucket上,碰撞到同一个Bucket槽上所有数据形成一个单链表

  2. 默认情况Entries槽中的数据按照添加顺序排列

  3. 删除的数据会形成一个FreeList的链表,添加数据的时候,优先向FreeList链表中添加数据,FreeList为空则按照count依次排列

  4. 字典查询及其的效率取决于碰撞的次数,这也解释了为什么Dictionary的查找会很快。

上述内容就是如何进行C#中Dictionary的内部实现分析,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。

元素 碰撞 下标 指向 位置 字典 数据 内容 再次 时候 算法 C# 分析 容量 技能 次数 知识 长度 变化 最小 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网佳科技有限公司 互联网最新的科技 朗新科技与工业互联网 互联网医疗科技 宜安科技 互联网金融 互联网科技的未来发展 互联网科技公司做什么 衡水科技产业互联网平台 现代科技和互联网有关系吗 浙江互联网科技研学营 工业互联网等科技实现智能化赋能 银行科技岗属于互联网吗 云南省自由互联网科技有限公司 杭州披云加互联网科技有限公司 互联网科技手机排行榜 互联网金融运营模式中的金融科技 广州三三互联网科技有限公司 恒生科技指数 中概互联网 黑龙江互联网科技公司 广州全民伙伴互联网科技有限公司 互联网是第几次科技革命的成果 互联网科技公司税收优惠 港股互联网科技股 善班互联网科技有限公司 华脉科技工业互联网产品 上海电发互联网科技有限公司 新兴科技互联网创新大赛颁奖典礼 伊宁互联网科技做什么的 华中科技大学互联网的牛人 东风日产互联网科技公司叫什么
0