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

【C#】Dictionary底层实现

Dictionary的键值对映射是通过哈希算法的函数建立的。这里不对哈希算法做过多的解释,算法本身就是将不定长度的键(可以是整数、字符串或对象)转化成一个固定值。

字典的关键成员

private struct Entry
{public int hashCode;public int next;public K key;//字典中键的类型public V value;//字典中值的类型
}private int[] buckets;//哈希桶数组
private Entry[] entries;//数据实体数组

buckets作用:存储entries 数据实体数组的索引

存储原理(添加键值对)

1.通过哈希(Hash)算法获取键的哈希值,赋值到数据实体 中hashCode
2.将hashCode对buckets数组长度取余(%)获得buckets数组中的buckets下标
3.通过buckets下标获得buckets数组中的元素(即为entries下标)
a.元素有效(!= -1)代表buckets 的索引位置 存储了 entries数组中索引,将当前元素赋值给Entry数据实体的next,并将Entry数据实体的索引赋值给buckets数组中的元素
b.元素无效(== -1)代表buckets 的索引位置 没有 entries数组中索引,将Entry数据实体的索引赋值给buckets数组中的元素

存储例子

插入数据A

Dictionary.Add("a", 123);

在这里插入图片描述

  1. 假设* 通过哈希(Hash)算法获取键(“a”)的值为10
  2. 将10对buckets数组长度取余(%)获得buckets数组中的索引2
  3. 通过 下标2 获得buckets数组中的buckets[2]
  4. buckets[2] == -1 代表buckets 的索引位置 没有 entries数组中索引,将Entry数据实体的索引赋值给buckets数组中的元素,即buckets[2] = 0

插入数据B

Dictionary.Add("qwe", 456);

在这里插入图片描述

  1. 假设* 通过哈希(Hash)算法获取键(“qwe”)的值也为10
  2. 将10对buckets数组长度取余(%)获得buckets数组中的索引2
  3. 通过 下标2 获得buckets数组中的buckets[2]
  4. buckets[2] != -1 代表buckets 的索引位置 存储了 entries数组中索引,将当前元素赋值给Entry数据实体的next,即数据B的next = buckets[2] = 0,并将Entry数据实体的索引赋值给buckets数组中的元素,即buckets[2] = 1

读取原理(通过键获取值)

  1. 通过哈希(Hash)算法获取键的哈希值,赋值到数据实体 中hashCode
  2. 将hashCode对buckets数组长度取余(%)获得buckets数组中的buckets下标
  3. 通过buckets下标获得buckets数组中的元素(即为entries下标)
  4. 根据下标获取entries中的数据,判断Entry数据的key是否与想获取的相同
    a. 相同,返回Entry数据的value
    b. 不相同,根据Entry数据的next获取entries中的数据,直到key与想获取的相同,才返回value

读取例子

获取数据A

Dictionary["a"]

在这里插入图片描述

  1. 假设* 通过哈希(Hash)算法获取键(“a”)的哈希值,赋值到数据实体为10
  2. 将10对buckets数组长度取余(%)获得buckets数组中的索引2
  3. 通过 索引2 获得buckets数组中的 buckets[2] = 1
  4. 根据 1 获取entries中的数据,判断 entries[1].key == “a”?
  5. (entries[1].key) = ”qwe“ != “a”,根据Entry数据的next获取entries中的数据 entries[next] = entries[0],直到key与想获取的相同 entries[0].key == “a”,才返回entries[0].value = 123

获取数据B

Dictionary["qwe"]
  1. 假设* 通过哈希(Hash)算法获取键(“a”)的哈希值,赋值到数据实体为10
  2. 将10对buckets数组长度取余(%)获得buckets数组中的索引2
  3. 通过 索引2 获得buckets数组中的 buckets[2] = 1
  4. 根据 1 获取entries中的数据,判断 entries[1].key == “qwe”?
  5. 相同,返回entries[1].value = 456

因为作者精力有限,文章中难免出现一些错漏,敬请广大专家和网友批评、指正。


http://www.mrgr.cn/news/64383.html

相关文章:

  • Nop入门:极简数据访问层实现
  • [RoarCTF 2019]Easy Calc 1
  • springboot3配置日志logback
  • js,ts控制流程
  • Chrome与夸克谁更节省系统资源
  • 【Unity基础】初识UI Toolkit - 编辑器UI
  • STM32F103的CAN通讯接收测试
  • P3-1.【结构化程序设计】第一节——知识要点:算法、顺序结构程序设计、if语句的语法结构及各种用法
  • 带你了解 Spring Cloud Config
  • [进阶]集合的进阶(1)泛型
  • python NLTK快速入门
  • Uniapp打包发布App Store时(90894)错误
  • “七巨头”(The Magnificent 7)科技公司财报喜忧参半看AI
  • 解读JobScheduler的jobs.xml
  • 在centos中安装cmake
  • MySQL基础(三)
  • Java入门(5)--多线程编程
  • MybatisPlus入门(六)MybatisPlus-空值处理
  • AI GPU系统调试能力与实践
  • 浙江深大智能科技有限公司管控平台服务端存在任意文件上传漏洞
  • 【ROS2】文档、教程、源码汇总
  • 【MyBatis源码】CacheKey缓存键的原理分析
  • LeetCode 104.二叉树的最大深度
  • 1Panel安装部署FileCodeBox
  • 搜狗输入法 14.10.0 | 直装去弹窗广告特别修改版,支持同步
  • python之函数总结