C# Hashtable vs Dictionary 学习笔记
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的关系一样啊。(恍然大悟)