zoukankan      html  css  js  c++  java
  • 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的关系一样啊。(恍然大悟)

  • 相关阅读:
    H5软键盘搜索
    ios顺畅滑动
    自定义滚动条样式
    mockjs模拟数据(本地版)
    移动端防止窗体滚动
    css超出部分省略号
    H5自带的type=date或者month等日期控件移动端显示placeholder
    判断是否在微信内打开
    滚动加载数据
    activemq 5.6 连接池的内存泄露问题
  • 原文地址:https://www.cnblogs.com/yougoo/p/7249621.html
Copyright © 2011-2022 走看看