C# 哈希表Hashtable与字典表Dictionary<K,V>的比较。
原文链接:https://blog.csdn.net/heyuchang666/article/details/50503240?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-50503240-blog-104036330.235%5Ev43%5Epc_blog_bottom_relevance_base4&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-50503240-blog-104036330.235%5Ev43%5Epc_blog_bottom_relevance_base4&utm_relevant_index=2
一Hashtable 和 Dictionary <K, V> 类型
1):单线程程序中推荐使用 Dictionary, 有泛型优势, 且读取速度较快, 容量利用更充分.
2):多线程程序中推荐使用 Hashtable, 默认的 Hashtable 允许单线程写入, 多线程读取, 对 Hashtable 进一步调用 Synchronized()方法可以获得完全线程安全的类型. 而Dictionary 非线程安全, 必须人为使用 lock 语句进行保护, 效率大减.
3):Dictionary 有按插入顺序排列数据的特性 (注: 但当调用 Remove() 删除过节点后顺序被打乱), 因此在需要体现顺序的情境中使用 Dictionary 能获得一定方便.
在使用哈希表保存集合元素(一种键/值对)时,首先要根据键自动计算哈希代码,以确定该元素的保存位置,再把元素的值放入相应位置所指向的存储桶中。在查找时,再次通过键所对应的哈希代码到特定存储桶中搜索,这样将大大减少为查找一个元素进行比较的次数。
HashTable中的key/value均为object类型,由包含集合元素的存储桶组成。存储桶是 HashTable中各元素的虚拟子组,与大多数集合中进行的搜索和检索相比,存储桶可令搜索和检索更为便捷。每一存储桶都与一个哈希代码关联,该哈希代码是使用哈希函数生成的并基于该元素的键。HashTable的优点就在于其索引的方式,速度非常快。如果以任意类型键值访问其中元素会快于其他集合,特别是当数据量特别大的时候,效率差别尤其大。
HashTable的应用场合有:做对象缓存,树递归算法的替代,和各种需提升效率的场合。
二、哈希表Hashtabl
Hastable是哈希表的实现,能根据关键字取关键值,这key的类型是object, value的类型也是object。
在哈希表中添加一个key/value键值对:HashtableObject.Add(key,value);
在哈希表中去除某个key/value键值对:HashtableObject.Remove(key);
从哈希表中移除所有元素: HashtableObject.Clear();
判断哈希表是否包含特定键key: HashtableObject.Contains(key);
遍历Hashtable对象的两种方法:
由于Hashtable每个元素都是一个键/值对,因此元素类型既不是键的类型,也不是值的类型,而是DictionaryEntry类型。
Hashtable示例代码
1 2 3 4 5 6 7 | <pre name= "code" class = "csharp" >Code highlighting produced by Actipro CodeHighlighter (freeware)http: //www.CodeHighlighter.com/-->//方法一 foreach (System.Collections.DictionaryEntry de in myHashtable) { //注意HastTable内存储的默认类型是object,需要进行转换才可以输出 Console.WriteLine(de.Key.ToString()); Console.WriteLine(de.Value.ToString()); } |
//方法二
1 2 3 4 5 6 | System.Collections.IDictionaryEnumerator enumerator = myHashtable.GetEnumerator(); while (enumerator.MoveNext()) { Console.WriteLine(enumerator.Key); // Hashtable关健字 Console.WriteLine(enumerator.Value); // Hashtable值 } |
三、字典Dictionary
1 | Dictionary<Tkey,Tvalue>是Hastbale的泛型实现。 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <span style= "font-size:18px;" >Code highlighting produced by Actipro CodeHighlighter (freeware)http: //www.CodeHighlighter.com/-->//遍历键 foreach ( string key in myDictionary.Keys) { //遍历某键的值 foreach ( string val in myDictionary[key]) { } }</span> 由于 Dictionary 是键和值的集合,因此元素类型并非键类型或值类型。相反,元素类型是键类型和值类型的 KeyValuePair 。 <span style= "font-size:18px;" >字典遍历示例 Code highlighting produced by Actipro CodeHighlighter (freeware)http: //www.CodeHighlighter.com/-->foreach (KeyValuePair<string, string> kvp in myDictionary) { string key = kvp.Key; //key包含了字典里的键 for ( int i = 0; i < kvp.Value.Count; i++) { Response.Write(kvp.Value[i]); } }</span> |
示例 :
代码
1 2 3 4 5 6 7 8 9 10 | Code highlighting produced by Actipro CodeHighlighter (freeware)http: //www.CodeHighlighter.com/-->//定义一个<string,int>的Dictionary,让它的值进行添加(也可以用Add方法) Dictionary< string , int > dic = new Dictionary< string , int >(); //添加两个键为"成绩1","成绩2";并为它们的值赋为0 dic[ "成绩1" ] = 0; dic[ "成绩2" ] = 0; // 把这两个值分别加1 dic[ "成绩1" ]++; dic[ "成绩2" ]++; |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2023-03-14 使用 pdf.js 在网页中加载 pdf 文件