C#中Dictionary的实现简述
更详细的解析可以查看这篇文章:https://blog.csdn.net/zhaoguanghui2012/article/details/88105715
简要描述就是通过桶Buckets与Entries
1.通过key1值获取哈希值h1 2.h1%桶长度得到入桶位置的m1,Buckets[m1] 3.寻找可存放Entry的位置,得到Entries[n1] 4.h1=>Buckets[m1]=>Entries[n1],形成映射关系
当不同key值hashCode相同时,利用单链表解决碰撞,例如
1.经过上面步骤已经有h1=>Buckets[m1]=>Entries[n1]的关系了,假设有key2获取哈希值同样为h1 2.入桶位置同样为m1,Buckets[m1] 3.寻找Entries位置,得到Entirs[n2] 4.此时即将形成Buckets[m1]=>Entries[n2]的关系,会取代原有关系,此时链表就起作用了 5.链表Entires[n2].next=Buckets[m1],即新元素的下一个指向旧元素 6.Buckets[m1]=Entires[n2],新元素取代以前旧元素的位置 7.5、6步骤就是说,新加入的元素存于链表的第一位,它的next就是上一个元素 8.此时整个映射关系应当是h1=>Buckets[m1]=>Entries[n2] 9.而且还有链表关系Entries[n2].next=>Entries[n1]
那么Dictionary执行查找逻辑顺序就很明显了
1.给定一个key3,获取hash值h3,假定h3与h1相等 2.那么通过关系h1=>Buckets[m1]=>Entires[n2],首先找到了元素n2 3.比较元素n2的key值是否与key3相等,相等就返回n2,不相等则查找链表下一个元素 4.Entries[n2].next=>Entires[n1]找到了n1,继续判定key值是否相等,不相等则继续查找下一个
删除动作
1.通过查找逻辑查找到Entries[x] 2.将其链表上一个元素的next赋值为本元素的.next 3.将其赋值为空,并记录当前Entries的空位置索引freeList=x,将其freeCount++
C#中Dictionary的实现简述的更多相关文章
- C#中Dictionary<TKey,TValue>排序方式
自定义类: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Sy ...
- .NET中Dictionary<TKey, TValue>浅析
.NET中Dictionary<TKey, Tvalue>是非常常用的key-value的数据结构,也就是其实就是传说中的哈希表..NET中还有一个叫做Hashtable的类型,两个类型都 ...
- C#中Dictionary小记
使用C#中Dictionary的一下细节小记: 一.Dictionary.Add(key,value) 与 Dictionary[key]=value的区别: 如果Dictionary中已经有了key ...
- C#中Dictionary的用法
在C#中,Dictionary提供快速的基于兼职的元素查找.他的结构是这样的:Dictionary<[key], [value]> ,当你有很多元素的时候可以使用它.它包含在System. ...
- ASP.NET中Dictionary基本用法实例分析
本文实例讲述了ASP.NET中Dictionary基本用法.分享给大家供大家参考,具体如下: //Dictionary位于System.Collections.Generic命名空间之下 /* * ...
- C#中Dictionary排序方式
转载自:https://www.cnblogs.com/5696-an/p/5625142.html 自定义类: https://files.cnblogs.com/files/xunhanliu/d ...
- Windows Presentation Foundation (WPF)中的命令(Commands)简述
原文:Windows Presentation Foundation (WPF)中的命令(Commands)简述 ------------------------------------------- ...
- C#中Dictionary,Hashtable,List的比较及分析
一. Dictionary与Hashtable Dictionary与Hashtable都是.Net Framework中的字典类,能够根据键快速查找值 二者的特性大体上是相同的,有时可以把Dicti ...
- C#中Dictionary的用法及用途
Dictionary<string, string>是一个泛型 他本身有集合的功能有时候可以把它看成数组 他的结构是这样的:Dictionary<[key], [value]> ...
随机推荐
- PHP0001:PHP环境搭建
1,本机域名解析 网站域名访问流程 配置阿帕奇服务器 的 路径 阿帕奇中添加 PHP 支持 一个简单的PHP 代码 检测PHP apache 语法 httpd -t apache 的启动 获取网站 ...
- Winform中怎样对窗体进行隐藏,再次打开时仍然保留上次的窗体
场景 点击按钮后打开窗口,点击窗口的确定按钮后即使窗体返回了Ok,此时不关闭窗体,将窗体隐藏. 再次点击按钮后,仍然打开上次的窗体. 注: 博客主页: https://blog.csdn.net/ba ...
- LAMP集成环境搭建
本教程是在centos6.8 64位系统下进行操作 我们首先准备搭建LAMP环境 LAMP指的是Linux.Apache.MySQL 和 PHP 如果要安装PHP5.5 需要 首先rpm -ivh h ...
- 《趣谈 Linux 操作系统》学习笔记(二):对 Linux 操作系统的理解
首先,我们知道操作系统是管理和控制计算机硬件与软件资源的计算机程序.这里把操作系统想象为一个软件外包公司,其内核就相当于这家外包公司的老板,那么我们可以把自己的角色切换成这家外包公司的老板,设身处地的 ...
- 剑指offer-面试题13-机器人的运动范围-递归法
/* 题目: 地上有一个m行n列的方格.一个机器人从坐标(0,0)的格子开始运动, 每次可向上.下.左.右移动一格,但不能进入行坐标和列坐标之和大于k的格子. 如,当k=18时,机器人能进入(35,3 ...
- 《操作系统真象还原》MBR
以下是读本书第三章的收获. 如何知道一个源程序的各符号(指令和变量)地址?简单来说,地址就是该符号偏移文件开头的距离,符号的地址是按顺序编排的,所以两个相邻的符号,其地址也是相邻的.对于指令来说,指令 ...
- Android_小账本小结
登录界面:支持登录.注册以及游客登录,单纯的小账本的话其实用不到这些个登录,单纯为了巩固学习知识. 尚未部署到服务器,账号等数据暂时保存在本地数据库中. 游客登陆:游客登录会直接跳到主页中,不影响使用 ...
- 问题 D: 八皇后
#include <cstdio> #include <vector> #include <algorithm> using namespace std; cons ...
- 金蝶云星空BOS开发视频分享
https://vip.kingdee.com/school/implementCourseOnline
- easyUI footer 的格式渲染
网上好多的例子,但是自己使用的情况下还是出现bug.比如以下代码: var myview = $.extend({}, $.fn.datagrid.defaults.view, { renderFoo ...