https://www.cnblogs.com/yinrq/p/5584885.html

一、HashTable

HashTable表示键/值对的集合。在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似key-value的键值对,其中key通常可用来快速查找,同时key是区分大小写;value用于存储对应于key的值。Hashtable中key-value键值对均为object类型,所以Hashtable可以支持任何类型的keyvalue键值对,任何非 null 对象都可以用作键或值。

HashTable是一种散列表,他内部维护很多对Key-Value键值对,其还有一个类似索引的值叫做散列值(HashCode),它是根据GetHashCode方法对Key通过一定算法获取得到的,所有的查找操作定位操作都是基于散列值来实现找到对应的Key和Value值的。

散列函数(GetHashCode)让散列值对应HashTable的空间地址尽量不重复。

当一个HashTable被占用一大半的时候我们通过计算散列值取得的地址值可能会重复指向同一地址,这就造成哈希冲突。

C#中键值对在HashTable中的位置Position= (HashCode& 0x7FFFFFFF) % HashTable.Length,C#是通过探测法解决哈希冲突的,当通过散列值取得的位置Postion以及被占用的时候,就会增加一个位移x值判断下一个位置Postion+x是否被占用,如果仍然被占用就继续往下位移x判断Position+2*x位置是否被占用,如果没有被占用则将值放入其中。当HashTable中的可用空间越来越小时,则获取得到可用空间的难度越来越大,消耗的时间就越多。

HashTable使用场景:

. 什么情况下使用哈希表

(1)某些数据会被高频率查询
(2)数据量大
(3)查询字段包含字符串类型
(4)数据类型不唯一

  

由于 Hashtable 和 Dictionary 同时存在, 在使用场景上必然存在选择性, 并不任何时刻都能相互替代.

[1] 单线程程序中推荐使用 Dictionary, 有泛型优势, 且读取速度较快, 容量利用更充分.
[2] 多线程程序中推荐使用 Hashtable, 默认的 Hashtable 允许单线程写入, 多线程读取, 对 Hashtable 进一步调用 Synchronized() 方法可以获得完全线程安全的类型. 而 Dictionary 非线程安全, 必须人为使用 lock 语句进行保护, 效率大减.
[3] Dictionary 有按插入顺序排列数据的特性 (注: 但当调用 Remove() 删除过节点后顺序被打乱), 因此在需要体现顺序的情境中使用 Dictionary 能获得一定方便.

个人偏向于使用Dictionary,因为其使用泛型,可控性比较强。在一些资料中,很多人也推荐使用Dictionary,其原因主要有

1、Dic是类型安全的,这有助于我们写出更健壮更具可读性的代码,而且省却我们强制转化的麻烦。
2、Dic是泛行的,当K或V是值类型时,其速度远远超过Hashtable。处理对象时不需要进行显式或是隐式转型,进行值类型处理时不需要装箱。所以使用方便一些,而且效率会高一些(编码效率、运行效率),还不太容易出错。

摘自于: https://www.2cto.com/kf/201304/201715.html

3、如果K和V都是引用类型,如eaglet所测,Hashtable比Dic更快,这里我要指出,eaglet所做的测试是有问题的。原因在于Hashtable与Dic采用的是不同的数据结构。eaglet的“Dictionary 由于在Hashtable基础上封装了一层”这个说法是不对的。

Dictionary 调用 Add 方法之前使用 ContainsKey 方法测试某个键是否存在,否则得到一个KeyNotFoundException。
当程序频繁尝试字典中不存在的键时,使用 TryGetValue 方法来检索值,这种方法是一种更有效的检索值的方法。

http://www.cnblogs.com/lucifer1982/archive/2008/06/18/1224319.html 
http://www.cnblogs.com/lucifer1982/archive/2008/07/03/1234431.html

Hashtable在指定capacity参数时,它并不只开出capacity个槽的内存空间,而是开出比 capacity / 0.72(默认装填因子) 大的最小素数个槽的空间;而Dic在指定capacity时,是开出 比capacity 大的最小素数个槽的空间。因此可以看到,楼主虽然都指定capacity为10万,而实际上Hashtable的槽的总数远远大于Dic的槽的总数,也就是占用的内存远远大于Dic,因此,如此测试是不公平不公正的,如要公平公正的测试,则应该把Dic的capacity指定为 10万/0.72,请大家再测试其性能。

url:http://www.cnblogs.com/jhh0111/archive/2008/10/23/1318223.html

我认为应该始终使用Dictionary<K, V>,即使要用Hashtable了,也可以用Dictionary<object, object>来替代。

关于Hashtable与Dictionary性能的讨论。:http://www.cnblogs.com/jhh0111/archive/2008/10/23/1318223.html

Dictionary 字典使用经验:

1.通过遍历获取Dictionary 的键值对时,  耗时: keys集合遍历 > keyvaluePair遍历

2.单独遍历获取Keys时,   keyValPair 遍历 > values 集合遍历  用KeyValuePair反而是累赘

1. 遍历性能,如果想通过遍历获取Dictionary 的键值对,方法有两种

方法 一

/// <summary>
        /// 通过key 访问键值对
        /// </summary>
        private static  void keyPerformance(Dictionary<string,string> dic)
        {
            DateTime start = DateTime.Now;
            string val = string.Empty;
            string key = string.Empty;
            foreach (string item in dic.Keys)
            {
                key = item;
                val = dic[item];
            }
            DateTime end = DateTime.Now;
            TimeSpan span = end.Subtract(start);
            Console.WriteLine(" foreach keys spend time:{0}",span.TotalMilliseconds);
        }

方法 二  性能最佳 推荐使用

/// <summary>
        /// 通过 KeyValuePair 访问键值对(推荐使用)
        /// </summary>
        /// <param name="dic"></param>
        private static void keyValPerformance(Dictionary<string , string> dic)
        {
            DateTime start = DateTime.Now;
            string val = string.Empty;
            string key = string.Empty;
            foreach (KeyValuePair<string ,string> item in dic)
            {
                key = item.Key;
                val = item.Value;
            }
            DateTime end = DateTime.Now;
            TimeSpan span = end.Subtract(start);

Console.WriteLine(" foreach keyVals spend time:{0}", span.TotalMilliseconds);
        }

以下是耗时对比

耗时: keys集合遍历 > keyvaluePair遍历

2. 其它遍历

如果获取 dictionary 中的key 推荐 方法一

耗时: keyvalPair 遍历 >keys 集合遍历

如果获取 dictionary 中的value 推荐如下方法

private static void valPerformance(Dictionary<string , string> dic)
        {
            DateTime start = DateTime.Now;
            string val = "";
            foreach (string  item in dic.Keys)
            {
                val = item;
            }
            DateTime end = DateTime.Now;
            TimeSpan span = end.Subtract(start);
            Console.WriteLine(" foreach vals spend time:{0}", span.TotalMilliseconds);
        }
 耗时: keyValPair 遍历 > values 集合遍历

  数据结构~时间复杂度:http://www.cnblogs.com/lori/p/3962707.html

扩展阅读:

  C#集合类型大揭秘:https://juejin.im/post/5b22ff4d51882574874d86c5

转载于:https://www.cnblogs.com/mailaidedt/p/10882666.html

HashTable,Dictionary,ConcurrentDictionary 的应用场景,区别,用法统计相关推荐

  1. hashset hastable dictionary concurrentdictionary区别

    hashset hastable dictionary concurrentdictionary区别 1.HashTable 哈希表(HashTable)表示键/值对的集合.在.NET Framewo ...

  2. Redis源码-Set:Redis Set存储原理、Redis Set集合操作命令、Redis Set两种存储底层编码intset+hashtable、Redis Set应用场景

    Redis源码-Set:Redis Set存储原理.Redis Set集合操作命令.Redis Set两种存储底层编码intset+hashtable.Redis Set应用场景 Redis数据类型 ...

  3. C#-深入理解async和await的作用及各种适用场景和用法

    第十五节:深入理解async和await的作用及各种适用场景和用法 一. 同步VS异步 1.   同步 VS 异步 VS 多线程 同步方法:调用时需要等待返回结果,才可以继续往下执行业务 异步方法:调 ...

  4. flash中Stage,stage,root和this的区别用法

    转载自:http://aresleecool.blog.163.com/blog/static/120715798201011895334718/ http://cctv566888.blog.163 ...

  5. Hashtable Dictionary的使用

    要了解C#中Hashtable Dictionary的使用,我们先来看一个例子! using System; using System.Collections; namespace NoSortHas ...

  6. php strpose_php中strpos()和stripos()函数的区别用法详解

    本篇文章主要给大家介绍PHP中strpos()和stripos()函数的区别用法介绍,希望对需要的朋友有所帮助! strpos()函数 这个函数帮助我们找到一个字符串在另一个字符串中第一次出现的位置. ...

  7. 软件自动化测试工具有哪些?手工测试与自动化测试应用场景区别

    常用的软件自动化测试工具有哪些?对于企业测试人员来说,工欲善其事必先利其器,了解软件测试工具能够更好的开展测试工作,为整体软件测试方案形成打下良好的基础.卓码软件测评小编整理了关于软件手工测试与自动化 ...

  8. Java容器集合类的区别用法

    Set,List,Map,Vector,ArrayList的区别 JAVA的容器---List,Map,Set  Collection  ├List  │├LinkedList  │├ArrayLis ...

  9. hashtable,dictionary 从原理上说说有什么异同,哪个性能高一些

    hashtable里存的对象全部是object类型 ,所有对象存进去都被转成object类型,读取出来每次都需要转换类型,hashtable对存入的类型没有限制 , 因此在读取转换类型时容易出错, d ...

最新文章

  1. Standup Timer的MVC模式及项目结构分析
  2. 单独运行shell脚本与crontab运行shell脚本的区别
  3. hotspot jvm_在Hotspot JVM中跟踪过多的垃圾收集
  4. ubuntu程序安装方法
  5. aws rds监控慢sql_AWS RDS SQL Server –监视数据库实例
  6. ACM基础——OJ上的Java代码提交规范
  7. Web笔记:jQuery的使用
  8. 【YY手机】用AVR单片机制作手机系列教程-基础篇
  9. 【C语言作业】一个数如果恰好等于它的因子之和,这个数就称为完整数。例如6的因子为1、2、3,而6=1+2+3,因此6是完数,编程找出1000之内的所有完整数
  10. 《RAFT-Stereo:Multilevel Recurrent Field Transforms for Stereo Matching》论文笔记
  11. fatal: unable to access 或者 fatal: could not read from remote repository
  12. WEKA算法解析 -- PART决策树
  13. 2020年熔化焊接与热切割多少钱及熔化焊接与热切割模拟试题
  14. Android 获取IMEI码
  15. 【数据集】中国各类水文专业常用数据集合集
  16. 二维地图展示爆管分析
  17. 初中数学老师计算机培训反思,初中数学教师培训研修总结范文(精选5篇)
  18. 【数据库】【NCRE】NCRE三级数据库技术选择题历年真题汇编(更新中)
  19. 一键清理oracle,一键清理 Nexus 中无用的 Docker 镜像
  20. 基于Java的电影订票网站的设计与实现

热门文章

  1. html等待图片全部加载,imgLoad等待图片资源加载完成后执行函数(图片预加载)...
  2. android如何做工作流,JIRA 知多少:聊一聊 Android Studio 、工作流相关设置
  3. 电脑小白用Linux,linux小白说说用linux的感受
  4. 对数正态分布_正态分布与幂律分布
  5. densenet网络结构_DenseNet轻量型网络
  6. python html模板_Python html.format_html方法代码示例
  7. android listview item按钮,android-listview适配器中的按钮
  8. 下列不是unix linux,下列软件中,不是操作系统的是______。A) LinuxB) UNIXC) MS-DOSD) MS-OfficeA.B.C.D._考题宝...
  9. JAVA写的多线程下载程序,并具有断点续传功能
  10. Python编程基础15:异常