C# Dictionary 的实现笔记

本文解析了C#中Dictionary的具体实现方式,包括使用拉链法解决哈希冲突的策略,Entry节点的组织形式,以及扩容机制等。此外还探讨了这种实现方式所带来的性能特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考博客园同学的博客:https://www.cnblogs.com/InCerry/p/10325290.html

C# 中使用拉链法解决哈希冲突,实现Dictionary的思路:

1、Dictionary 中的数据放在Entry[]中,每个entry为单向的链表包括Key、Value 、HashCode,同时指向之后添加的出现Hash冲突的 Next Entry。

2、Entry的存放位置是放在槽int[] buckets中,每向Dictionary新增一项,都是通过Hash桶的算法,确定在buckets中的位置 i,新建NewEntry节点,NewEntry的Next指向buckets[i]中存贮的OldeEntry在Entry[]中的位置,buckets[i]更新为NewEntry在Entry[]中的位置。

3、在删除KeyValuePair时,会改变Entry的单向链,移除的Entry节点放入额外的一条int[] FreeList记录,每次在新建Entry时,有限从FreeList中取,之后再从Entry[]顺序存储。

4、根据Key查询时:哈希桶确认buckets的i->取buckets[i]作为第一个Entry的值->从Entry[buckets[i]]中匹配Key->没找到则去Next匹配->一直到最后

5、在扩容时,则要重新计算每一个Key的HashCode,重新匹配buckets,还要重新分配Entry的单向链表,而且哈希桶算法的桶个数都设置为素数。

6、会设定哈希碰撞的阈值,如果达到,则会触发扩容。

性能问题:

1、由于每次插入时做哈希桶算法,而且修改buckets,可能会触发扩容和再分配,所以新增时的速度会受影响。

2、在由Key查找时,经过哈希桶,查询单向链表,由于碰撞次数阈值的存在,会很快。

 

转载于:https://www.cnblogs.com/slarkleoric/p/10649659.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值