C#中Dictionary底层剖析

这也是最近面试遇到的一个问题,所以特来记录一下。

我们使用字典的时候通常都是在两个值有映射关系的情况下使用,其数据结构是用关键字Key——Value进行映射的。那么Key是如何映射到对应Value的呢?

这类映射关系可以通过Hash函数建立,Dictionary会对每个Key加入容器的元素都进行一次Hash运算,这个哈希运算有很多种算法,其中最简单的是取余操作。

对于实例对象和字符串来说,它们么有直接的数字作为Hash的标准,所以他们会通过其内存地址去计算一个Hash值,这个内存对象的函数就叫做HashCode,他是基于内存地址计算而来的。

对于不同的Key值,在Hash计算的时候我们可能会得到同一个Hash地址。简单来说就是当Key不相等的时候,他的HashCode相等,这就造成了哈希冲突,而这种冲突是不能完全避免的。那么如何解决冲突,就是构造Hash表种必须要解决的一个问题。

Hash冲突的解决办法通常有:开放定址法,再Hash法,拉链法,建议公共溢区等。再Dictionary中,采用的是拉链法。

拉链法的原理:

将所有关键字为同义词的节点链接在同一个单链表中。

简单解释这句话意思就是,当我们给定的一个Key值,通过这个构造这个Hash表时候给定的Hash函数求得Hash地址,若在表中没有记录这个地址则表示查找不成功,否则比较关键字,若给定的值相等,则表示查表成功。否则更具冲突处理的方法寻找下一个地址,直到Hash表中某个位置为空或者表中记录的关键字等于给定值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值