C# 雜湊表Hashtable與字典表Dictionary的比較。

來源:互聯網
上載者:User

一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"]++;





聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.