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

时间: 2024-10-21 04:55:01

C# Hashtable vs Dictionary 学习笔记的相关文章

【DAY12】第十二天集合&泛型&IO学习笔记

hash:散列 ------------------ Hashset集合内部是通过HashMap进行实现的.使用的是HashMap中key部分. 对象在添加进集合中时,首选会对hashcode进行处理(hashcode右移16位和 自身做异或运算)得到一个经过处理的hash值,然后该值和集合的容量进行 &运算,得到介于0和集合容量值之间一个数字.该数字表示着数组的下标. 也就是该元素应该存放在哪个元素中. Map与Collection -------------- Map与Collection在

Hadoop源码学习笔记(1) ——第二季开始——找到Main函数及读一读Configure类

Hadoop源码学习笔记(1) ——找到Main函数及读一读Configure类 前面在第一季中,我们简单地研究了下Hadoop是什么,怎么用.在这开源的大牛作品的诱惑下,接下来我们要研究一下它是如何实现的. 提前申明,本人是一直搞.net的,对java略为生疏,所以在学习该作品时,会时不时插入对java的学习,到时也会摆一些上来,包括一下设计模式之类的.欢迎高手指正. 整个学习过程,我们主要通过eclipse来学习,之前已经讲过如何在eclipse中搭建调试环境,这里就不多述了. 在之前源码初

非计算机专业的码农C#学习笔记 五、数组和集合

数组和集合 1.数组问题Array (1)一维数组:int[] arr={1,2,3,5,5} string[] s={s,l,s,g} (2)二维数组:int[,] arr=new int[2,2]{{1,2},{3,4}} 类型[,] 数组名=new 类型[行数(元素数),列数(元素的子元素数]{{元素1,元素2},{元素…},…,} l  动态数组:类型[,] 数组名=new 类型[M,N],int M=””;int N=””; l  查看内部元素:foreach(int n in arr

swift学习笔记(三)关于拷贝和引用

在swift提供的基本数据类型中,包括Int ,Float,Double,String,Enumeration,Structure,Dictionary都属于值拷贝类型. 闭包和函数同属引用类型 捕获则为拷贝.捕获即定义这些常量和变量的原作用域已不存在,闭包仍然可以在闭包函数体内引用和修改这些值 class属于引用类型. Array的情况稍微复杂一些,下面主要对集合类型进行分析: 一.关于Dictionary:无论何时将一个字典实例赋给一个常量,或者传递给一个函数方法时,在赋值或调用发生时,都会

IOS学习笔记 -- Modal和Quartz2D

一. Modal1.Modal的默认效果:新控制器从屏幕的最底部往上钻,直到盖住之前的控制器为止;Modal只是改变了View的现实,没有改变rootViewController 2.常用方法1>.以Modal的形式展示控制器- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion2>.关

黑马程序员_OC学习笔记之Foundation框架集合类

OC--集合类 1.OC集合类包括NSArray,NSSet,NSDictionary都是以面向对象的方式操作数组,而且OC数组不像C语言中的数组只能存放同一种数据类型,它可以存放任意类型的对象,但是不能存放非OC对象类型如基本数据类型int,struct,enum等 2.OC数组是以对象的方式存在,因此在创建的时候需要为创建的对象前面加* 3.NSArray数组一旦创建就决定了是不是可变,而且永远是可变或不可变 4.NSArray数组和子类NSMutableArray的基本操作: 1>使用NS

Swift学习笔记

Apple 新推的Swift已经好几天了.对于向我这样的oc都还没完全琢磨透彻的菜鸟来说--(简直就是福利啊,joke) 看了几天的Swift,只是有了基本的印象.总感觉比较换混乱,可能源自与自己没怎么学过脚本语言.索性,边看边记,加深印象. 本来部分内容源自Apple的<The Swift Programming Language>以及互联网教程.其余内容均为个人理解,不保证正确. 进入正题: 1.Swift是什么? Apple唤他作:雨燕.其实英语过了四级的都应该看出来,Swift还有一层

openerp学习笔记 context 的应用

1.在Action中定义,context用于传递搜索条件和分组条件,在搜索视图中默认显示: 示例代码: <record model="ir.actions.act_window" id="open_company_allocation"> <field name="name">Leaves Summary</field> <field name="res_model">hr.ho

SuperSocket学习笔记(一)

这是根据我自己学习的经历整理出来的,如有不对之处,还请多多指教! SuperSocket源码下载 SuperSocket文档 安装并启动Telnet 学习方法: QuickStrart + 文档 参考资料: 服务器架设:    http://blog.csdn.net/kuanzai123/article/details/17013213 基本认识:        http://blog.qiangk.com/2013/08/03/learning-supersocket-opensouce-p