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的关系一样啊。(恍然大悟)

原文地址:https://www.cnblogs.com/yougoo/p/7249621.html