C# Hashtable vs Dictionary 學習筆記
阿新 • • 發佈:2017-07-28
new 拆箱 打印 筆記 兩個 args for com 比較
Hashtable 和 Dictionary 存儲的都是鍵值對,我的理解是Dictionary是Hashtable的泛型實現。
Hashtable的鍵和值都是object類型。所以,key和value 都可以是不同類型的值。當把變量定義成Dictionary<object, object> dic時,表現上就和Hashtable一樣了。
class Program { static void Main(string[] args) { Hashtable ht = new Hashtable(); Dictionary<object, object> dic = new Dictionary<object, object>(); TestClass tc1 = new TestClass(); TestClass tc2 = new TestClass(); ht.Add(tc1, tc1); ht.Add("key2", "htv2"); dic.Add(tc1, tc1); dic.Add("key2", "dicv2"); Console.WriteLine(ht[tc1]+ " " + ht["key2"]); Console.WriteLine(dic[tc1] + " " + dic["key2"]); Console.ReadLine(); } class TestClass { public int x; public int y; } }
輸出如下:
接下來比較一下性能方面:
首先測試 key和value都是整型的情況:
static void Main(string[] args) { Hashtable ht= new Hashtable(); Dictionary<object, object> dic = new Dictionary<object, object>(); //Dictionary<object, int> dic = new Dictionary<object, int>(); //Dictionary<int, int> dic = new Dictionary<int, int>(); Stopwatch sw = new Stopwatch();
int count = 1000000; sw.Start(); for (int i = 0; i < count; i++) { ht.Add(i, i); } sw.Stop(); Console.WriteLine(sw.ElapsedMilliseconds);
//sw.Start(); //for (int i = 0; i < count; i++) //{ // dic.Add(i, i); //} //sw.Stop(); //Console.WriteLine(sw.ElapsedMilliseconds); Console.ReadLine(); }
開始我是兩段一起測的,後來我對換兩個for循環代碼塊發現測試先後順序會影響測試結果。所以我後面采用了分開測多個值的方案。
打印結果如下:
Hashtable: 190 179 178 185 172
Dictionary<object,object>: 184 192 177 184 195
Dictionarty<object,int>: 88 96 87 91 90
Dictionarty<int,int>: 35 35 35 39 36
會發現,當Dictionary的鍵值的類型越精確,性能越高。
總結:
1、Hashtable會把鍵值轉成object存儲;(裝箱拆箱要消耗性能)
2、除非鍵和值的類型都不統一,否則,不要用Hashtable;
3、Hashtable和Dictionary的關系就像ArrayList和List的關系一樣啊。(恍然大悟)
C# Hashtable vs Dictionary 學習筆記