Dictionary<TKey,TValue>
/*
* 先将 key 和 bucket 的长度一起,经过简单的 hash 算法计算出元素应该放在哪个 bucket .
* 但是,元素并不是放在 bucket 里面的,bucket 只是对元素存放位置的第一次计算, 它其实是为了解决 hash 冲突设计的,它并不存放我们添加的元素.
* 当确定了 bucket 后,再将元素存放在 Entry[] 中, 这个数组才是实际存放元素的容器.并且所有元素都存放在这个数组中.
* 因此,当 Dictionary 需要扩容的时候,不仅 bucket 需要扩容, Entry[] 也需要扩容,当然,数组长度是不能变的,肯定是新建一个容量更大的,然后 copy 一份老的数据过去.
* 前面说了,hash 会冲突,比如 1%3=1 , 4%3=1 ,那么这时候,1 和 4 这两个数作为 key ,就会导致 hash 冲突,它们两个通过计算后,都会选择 bucket[1] 这个"桶",
* 那么,问题来了,
* bucket[1] = ? , 如果没有 hash 冲突,这个值完全可以用来存储 key 对应的 value.但是现在有两个"相同的" key 对应的 value 都需要存到这里,怎么办呢?
* 答案是"栈"+"链表",之所以加个引号,是因为不是真正用的栈和链表,而是借用了它们的思想.
* bucket 里面存储的是当前 bucket "里面" 最后添加的那个元素在 Entry[] 中的下标.
* 比如,我们先添加一个 dic.Add(1,value) ,那么,这时候,Entry[] 就有1个元素了,Entry[0]
* 我们假设通过 hash 计算,这个键值对元素应该放在 bucket[1] 这个桶里面,因此这时候 bucket[0] = 0 ,等号右边的 0 表示 Entry[] 的下标.
* 我们再 Add(4,value),这时候,Entry[] 有2个元素,Entry[0] 和 Entry[1],
* 并且我们假设通过 hash 计算,这个键值对元素也应该放在 bucket[1] 这个桶里面,
* 那么,这时候 bucket[0] 就不在 = 0了,而是 = 1,
* 并且 Entry[1] 中的元素(Entry 类型)有个 next 字段,其值 = 0, 这个 0 就是 Entry[] 的索引,表示该元素的下个元素是 Entry[0] ,进一步说就是
* 桶1里面有两个元素,最上面的(第2次放进去的)是 Entry[1] ,第2个(第1次放进去的那个)是 Entry[0],并且通过 Entry[1] 是可以找到 Entry[0] 的.
* 到这里,突然发现 bucket 这个命名很形象.
* 桶有什么特点呢?桶就好比是一个栈,"先进后出",最先进去的在最下面.
* 也就是说,一个桶第一次装进去的那个元素的 next 永远 = -1
* 第2次进去的指向第1个,第3次进去的指向第2个......
* 感觉这个设计好巧妙!!!
*
*/
Dictionary<TKey,TValue>的更多相关文章
- convert NameValueCollection/Dictionary<string, object> to JSON string
public static class WebExtension { public static T Decode<T>(this RequestBase res) { Type type ...
- Dictionary<string, object>
Dictionary<string, object> dcic = JsonHelper.DataRowFromJSON(resultdepth); foreach (var depthk ...
- Dictionary<string, object>不区分大小写
Dictionary<string, object> dic = new Dictionary<string, object>(StringComparer.OrdinalIg ...
- Tuple<int, int> Dictionary<string, object>妙用
Tuple<int, int> Dictionary<string, object>妙用
- c# Dictionary<string, object> 转JSON字符串
JavaScriptSerializer jss = new JavaScriptSerializer(); Dictionary<string, object> dict = new D ...
- MVC object htmlAttributes,IDictionary<string, object> htmlAttributes 写法
MVC object htmlAttributes:new {style="color:red",width="12px",height="10px& ...
- List<T>与Dictionary<string,T>频繁检索的性能差距
一直对LINQ简洁高效的语法青睐有加,对于经常和资料库,SQL语法打交道的C#开发者来说,LINQ无疑是一个非常不错的选择,当要在List<T>(T为一个普通对象)集合中查找满足某些条件的 ...
- MVC 自定义IModelBinder实现json参数转Dictionary<string, string>
IModelBinder的学习不算深入,现在用它来实现一个json转Dictionary<string, string> 一.原始json转Dictionary<string, st ...
- QueryString to Dictionary<string, string>
public class ModelConvertHelper<T> where T : new() {// 此处一定要加上new() public static IList<T&g ...
- 分页查询和分页缓存查询,List<Map<String, Object>>遍历和Map遍历
分页查询 String sql = "返回所有符合条件记录的待分页SQL语句"; int start = (page - 1) * limit + 1; int end = pag ...
随机推荐
- 改变你一生的编辑器:VSCode使用总结
开发十年,只剩下这套Java开发体系了 >>> 前言:vscode是微软出品的,基于Electron和TypeScript的,现在已经是最火的一款文本编辑器.我认为vscode是 ...
- 1.ideal常用快捷键
Alt+回车 导入包,自动修正Ctrl+N 查找类Ctrl+Shift+N 查找文件Ctrl+Alt+L 格式化代码 Ctrl+Alt+O 优化导入的类和包Alt+Insert 生成代码(如ge ...
- HDU6127 简单几何 暴力二分
LINK 题意:给出n个点,每个点有个权值,可以和任意另外一点构成线段,值为权值积.现问过原点的直线中交所有线段的权值和的最大值,注意直线必不经过点. 思路:直线可以将点集分为两侧,此时的权值为两侧点 ...
- PHP扩展--opcache安装及配置
简介 Optimizer+ 是 Zend 开发的闭源但可以免费使用的 PHP 优化加速组件,是第一个也是最快的 opcode 缓存工具.现在,Zend 科技公司将 Optimizer+ 在 PHP L ...
- 重构改善既有代码设计--重构手法18:Self Encapsulate Field (自封装字段)
你直接访问一个值域(field),但与值域之间的耦合关系逐渐变得笨拙. 为这个值域建立取值/设值函数(getting/setting methods),并且只以这些函数来访问值域. private i ...
- 登入时session的处理方式
暂时理解不够彻底 有空在详细介绍,先记录代码 1:创建一个工具类 存取当前登录用户 package com.liveyc.eloan.util; import javax.servlet.http ...
- js获得页面鼠标位置
1.客户区坐标位置:clientX,clientY 鼠标相对于在当前页面可视范围左上角的位置 2.页面坐标位置:pageX,pageY 鼠标相对于页面左上角的位置(受滑动等影响,例如pageY=cli ...
- 17 - 路径操作-shutil模块
目录 1 路径操作 1.1 os.path模块 1.2 pathlib模块 1.2.1 目录操作 1.2.2 文件操作 1.3 os 模块 2 shutil模块 2.1 copy复制 2.2 rm删除 ...
- svn add --no-ignore
提交新代码时:svn add --no-ignore /dir 不加的话可能会漏提交某些依赖或文件. Svn st -q --no-ignore. 提交时不需要加
- xshell 映射带跳板机服务器的端口到本地
1.配置xshell连接跳板机服务器: 2. 3.可用navicate等同过端口连接远程数据库.