Dictionary<TKey, TValue> () Hashtable()
第一、存儲的數據類型
Hashtable不是泛型的,不是類型安全的;Dictionary是泛型的,是類型安全的;
Hashtable的鍵值都是Object類型的,但是Dictionary的鍵值的數據類型是可以指定的。
也就是說如果往Hashtable里面存入Object以外的數據類型,則在取出該數據時,需要對其進行顯示的類型轉換,才能夠正常使用。而Dictionary則沒有這個問題。
從這方面講的話,Hashtable相當于Dictionary<Object,Object>
Hashtable ht = new Hashtable(); Dictionary<string, int> dic = new Dictionary<string, int>(); ht.Add("A", 1); dic.Add("A", 1); //Console.WriteLine(ht["A"]+1); //編譯錯誤!Object類型不能和int類型直接進行相加。 Console.WriteLine((int)ht["A"] + 1);//編譯通過,輸出結果為:2 Console.WriteLine(dic["A"] + 1); //編譯通過,輸出結果為:2
第二、讀取數據的順序與添加數據的順序的一致性
Dictionary和Hashtable的讀取數據的順序和添加數據時的數據的順序的一致性均不能夠保證,或者可以說沒有一致性。
Dictionary在只添加不刪除的時候能夠保持讀取數據的順序和添加時候的順序是一致的;
但是經過刪除和添加操作之后,就不能夠保證讀取數據的順序和添加時候的順序一致了。
Dictionary<int, int> dic = new Dictionary<int, int>(); dic.Add(0, 0); dic.Add(1, 1); dic.Add(2, 2); Console.WriteLine("僅僅經過添加元素處理之后:"); foreach (KeyValuePair<int, int> kvp in dic) { Console.WriteLine("Key:" + kvp.Key + " Value:" + kvp.Value); } dic.Remove(0); dic.Add(3, 3); Console.WriteLine("經過刪除和添加元素處理之后:"); foreach (KeyValuePair<int, int> kvp in dic) { Console.WriteLine("Key:" + kvp.Key + " Value:" + kvp.Value); } Console.ReadKey();
對于Dicitionary而言,如果從中刪除一個元素,則之后新添加的元素會填補這個被刪除元素的位置,因而致使添加數據的順序與讀取數據的順序是不一致的。
對于Hashtable而言,它的數據存儲順序是按一定的算法算出來的,所以絕大多數情況下,它的數據讀取順序和數據添加順序是不一致的。
所以如果你需要保持數據添加時的順序的時候,最好不要用Dictionary和Hashtable。
第三、當用一個不存在的Key值到Hashtable或者Dictionary中取值時
對于Hashtable而言,如果用一個不存在的Key值進行取值的話,會返回一個null;
Hashtable ht = new Hashtable(); Console.WriteLine(ht["b"]==null); Console.ReadKey();
對于Dictionary而言,如果用一個不存在的Key值進行取值的話,會引發“System.Collections.Generic.KeyNotFoundException”類型的異常。
所以在從Dictionary或者Hashtable取值時,可以先判斷Key值是否存在(用ContainsKey()方法進行判斷),以防止出現預期以外的值或者異常。
第四、線程安全性
Dictionary不是線程安全的,Hashtable是線程安全的。
新聞熱點
疑難解答