1. 程式人生 > >C# Hashtable vs Dictionary 學習筆記

C# Hashtable vs Dictionary 學習筆記

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 學習筆記