码迷,mamicode.com
首页 > Windows程序 > 详细

C#中Dictionary,Hashtable,List的比较及分析

时间:2015-10-26 15:36:08      阅读:571      评论:0      收藏:0      [点我收藏+]

标签:

一. Dictionary与Hashtable

Dictionary与Hashtable都是.Net Framework中的字典类,能够根据快速查找

字典的性能取决于键类型的GetHashCode()方法的实现代码。

键类型也必须实现IEquatable<T>.Equals()方法,并且如果A.Equals(B)返回true,则A和B的GetHashCode()也必须返回相同的值。

 

 

Dictionary

  • 适合多线程
  • 有泛型优势(类型安全,性能更好),对于值类型,不存在装箱和拆箱的性能损耗
  • 读取速度快(体现在单条数据上)
  • 容量利用更充分
  • 有序

Hashtable

  • 通过静态方法Synchronize方法可获得完全线程安全的类型
  • 无序

 

二.List与Dictionary

List有点类似于Dictionary。二者都具有使用泛型的优点,Dictionary没有在内存中移动后续元素的性能开销。

List遍历查询更快(数据较多时),Dictionary单条查询更快

引用某一篇文章的分析:

同样是集合,为什么性能会有这样的差距。我们要从存储结构和操作系统的原理谈起。 
首先我们清楚List<T>是对数组做了一层包装,我们在数据结构上称之为线性表,而线性表的概念是,在内存中的连续区域,除了首节点和尾节点外,每个节点都有着其唯一的前驱结点和后续节点。我们在这里关注的是连续这个概念。
而HashTable或者Dictionary,他是根据Key而根据Hash算法分析产生的内存地址,因此在宏观上是不连续的,虽然微软对其算法也进行了很大的优化。
由于这样的不连续,在遍历时,Dictionary必然会产生大量的内存换页操作,而List只需要进行最少的内存换页即可,这就是List和Dictionary在遍历时效率差异的根本原因。
 
6. 再谈Dictionary 
也许很多人说,既然Dictionary如此强大,那么我们为什么不用Dictionary来代替一切集合呢? 
在这里我们除了刚才的遍历问题,还要提到Dictionary的存储空间问题,在Dictionary中,除了要存储我们实际需要的Value外,还需要一个辅助变量Key,这就造成了内存空间的双重浪费。 
而且在尾部插入时,List只需要在其原有的地址基础上向后延续存储即可,而Dictionary却需要经过复杂的Hash计算,这也是性能损耗的地方。 
 
 
 

C#中Dictionary,Hashtable,List的比较及分析

标签:

原文地址:http://www.cnblogs.com/TiestoRay/p/4891026.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!