C# 哈希表Hashtable与字典表Dictionary<K,V>的比较。

来源:互联网 发布:淘宝宝贝批量上架 编辑:程序博客网 时间:2024/06/11 20:52

一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示例代码 
<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());}//方法二System.Collections.IDictionaryEnumerator enumerator = myHashtable.GetEnumerator();while (enumerator.MoveNext()){    Console.WriteLine(enumerator.Key);       // Hashtable关健字    Console.WriteLine(enumerator.Value);      // Hashtable值}


三、字典Dictionary

Dictionary<Tkey,Tvalue>是Hastbale的泛型实现 

<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>


示例 

代码 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";并为它们的值赋为0dic["成绩1"] = 0;dic["成绩2"] = 0;// 把这两个值分别加1dic["成绩1"]++;dic["成绩2"]++;





2 0
原创粉丝点击