C# 雜湊表Hashtable與字典表Dictionary<K,V>的比較。

yinghualeihenmei發表於2024-03-14

原文連結: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示例程式碼

<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";併為它們的值賦為0
dic["成績1"] = 0;
dic["成績2"] = 0;

// 把這兩個值分別加1
dic["成績1"]++;
dic["成績2"]++;

 

相關文章