HashTable與Dictionary比較
看了好多這兩個類的總結,不同的人理解有些偏差,總結如下:
首先,兩者都用來儲存鍵值對。對於二者的區別,最明顯的就是Dictionary針對的是泛型,而HashTable是非泛型,鍵值對均為object型別,類似於list與arraylist的關係。
1:單執行緒程式中推薦使用 Dictionary, 有泛型優勢, 且讀取速度較快, 容量利用更充分.
2:多執行緒程式中推薦使用 Hashtable, 預設的 Hashtable 允許單執行緒寫入, 多執行緒讀取, 對 Hashtable 進一步呼叫 Synchronized() 方法可以獲得完全執行緒安全的型別. 而 Dictionary 非執行緒安全, 必須人為使用 lock 語句進行保護, 效率大減.
3:Dictionary 有按插入順序排列資料的特性 (注: 但當呼叫 Remove() 刪除過節點後順序被打亂), 因此在需要體現順序的情境中使用 Dictionary 能獲得一定方便.
對於值型別,特定型別(不包括 Object)的 Dictionary<(Of <(TKey, TValue>)>) 的效能優於 Hashtable,這是因為 Hashtable 的元素屬於 Object 型別,所以在儲存或檢索值型別時通常發生裝箱和拆箱操作。
//使用索引器來取值時,如果鍵不存在就會引發異常
try
{
Console.WriteLine("不存在的鍵""fff""的鍵值為:" + myDic["fff"]);
}
catch (KeyNotFoundException ex)
{
Console.WriteLine("沒有找到鍵引發異常:" + ex.Message);
}
//解決上面的異常的方法是使用ContarnsKey() 來判斷時候存在鍵,如果經常要取健值得化最好用 TryGetValue方法來獲取集合中的對應鍵值
string value = "";
if (myDictionary.TryGetValue("fff", out value))
{
Console.WriteLine("不存在的鍵""fff""的鍵值為:" + value );
}
else
{
Console.WriteLine("沒有找到對應鍵的鍵值");
}
//下面用foreach 來遍歷鍵值對
//泛型結構體 用來儲存健值對
foreach (KeyValuePair<string, string> temp in myDictionary)
{
Console.WriteLine( temp .Key, temp .Value);
}
//獲取值得集合
foreach (string s in myDictionary.Values)
{
Console.WriteLine("value"+ s);
}
//獲取值得另一種方式
Dictionary<string, string>.ValueCollection values = myDictionary.Values;
foreach (string s in values)
{
Console.WriteLine("value:"+ s);
}