/*
* 先将 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>的更多相关文章

  1. convert NameValueCollection/Dictionary<string, object> to JSON string

    public static class WebExtension { public static T Decode<T>(this RequestBase res) { Type type ...

  2. Dictionary<string, object>

    Dictionary<string, object> dcic = JsonHelper.DataRowFromJSON(resultdepth); foreach (var depthk ...

  3. Dictionary<string, object>不区分大小写

    Dictionary<string, object> dic = new Dictionary<string, object>(StringComparer.OrdinalIg ...

  4. Tuple<int, int> Dictionary<string, object>妙用

    Tuple<int, int> Dictionary<string, object>妙用

  5. c# Dictionary<string, object> 转JSON字符串

    JavaScriptSerializer jss = new JavaScriptSerializer(); Dictionary<string, object> dict = new D ...

  6. MVC object htmlAttributes,IDictionary<string, object> htmlAttributes 写法

    MVC object htmlAttributes:new {style="color:red",width="12px",height="10px& ...

  7. List<T>与Dictionary<string,T>频繁检索的性能差距

    一直对LINQ简洁高效的语法青睐有加,对于经常和资料库,SQL语法打交道的C#开发者来说,LINQ无疑是一个非常不错的选择,当要在List<T>(T为一个普通对象)集合中查找满足某些条件的 ...

  8. MVC 自定义IModelBinder实现json参数转Dictionary<string, string>

    IModelBinder的学习不算深入,现在用它来实现一个json转Dictionary<string, string> 一.原始json转Dictionary<string, st ...

  9. QueryString to Dictionary<string, string>

    public class ModelConvertHelper<T> where T : new() {// 此处一定要加上new() public static IList<T&g ...

  10. 分页查询和分页缓存查询,List<Map<String, Object>>遍历和Map遍历

    分页查询 String sql = "返回所有符合条件记录的待分页SQL语句"; int start = (page - 1) * limit + 1; int end = pag ...

随机推荐

  1. 倍增求lca模板

    倍增求lca模板 https://www.luogu.org/problem/show?pid=3379 #include<cstdio> #include<iostream> ...

  2. SQLServer字符串的一些截取技巧

    先看一张科学家的生卒年月表 截取科学家的出生年份可以很方便的用left函数截取,如果要截取去世年份,需要先获取字符“—”的位置. select substring(c,charindex('—',c) ...

  3. (三)配置Hadoop1.2.1+eclipse(Juno版)开发环境,并运行WordCount程序

    配置Hadoop1.2.1+eclipse(Juno版)开发环境,并运行WordCount程序 一.   需求部分 在ubuntu上用Eclipse IDE进行hadoop相关的开发,需要在Eclip ...

  4. spring-boot支持websocket

    spring-boot本身对websocket提供了很好的支持,可以直接原生支持sockjs和stomp协议.百度搜了一些中文文档,虽然也能实现websocket,但是并没有直接使用spring-bo ...

  5. solr笔记之安装部署到tomcat

    1. 下载 solr 去官网下载,下载的时候选清华的镜像源,这个页面:https://mirrors.tuna.tsinghua.edu.cn/apache/lucene/solr/7.1.0/ 在/ ...

  6. yii2-widget-fileinput英文文档翻译

    源地址:http://plugins.krajee.com/file-input 该插件是为bootstrap开发的增强版h5文件上传插件,具有多文件预览,多文件选择等功能.该插件提供了基于boots ...

  7. perl6正则 1: ~~ , //, m//, rx//

    ~~ perl6 中, 要匹配一个正则, 使用 ~~ 智能匹配符. > so 'abcde' ~~ /a.c/ True > so 'abcde' ~~ /a.d/ False > ...

  8. 做php网站后台开发,在Linux系统上进行更好吗?【转载】

    1. PHP是开源软件,它在bsd/linux/win下都有很好的正式版及孪生版.并非开发php就必须要在linux下进行.主机服务商们习惯性的把asp与php分为两个主机系列几进行销售.由于asp只 ...

  9. redis aof文件过大问题

    http://www.itnose.net/detail/6682725.html 最近新安装了一台redis,版本为redis-3.2.5 数据盘用的是固态硬盘. 之前用的是普通硬盘,redis日志 ...

  10. /etc/issue 与 /etc/issue.net 文件,telnet登陆前的显示

    在使用文本设备(关于文本设备的例子,见下面的说明)登录Linux系统之前,系统会显示一条被称作“issue”的消息: 若是通过本地文本设备(如本地终端,本地虚拟控制台等)登录,则该信息存放与/etc/ ...