1. 程式人生 > >HashTable與Dictionary比較

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);
    }