基于昨天在群里讨论的惨败,今早特意睡不着就早早爬起来,钻研前人对集合的理解,这文不少都是抄的,就当记忆记忆。
首先这四个大体能够分为两类,第一类是list和array,第二类是dictionary和hashtable。
1.list和array
在《Effective C#》中有这样一条规则,就是说:在初始化List以前最好对List初始化大小。
在初始化List时,List会新建一个数组,然后把数组的长度设置为原来的二倍(若是原有的数组长度为0,那就默认将数组的长度设置为4)。
List<T>是对Array的进一步封装,说得再直接点,我愿意理解List<T>为Array的可扩充版本,而后扩展了一些方法;
List是基于Array存在的,所以,在建立一个List对象时,须要耗费比Array相对更多的时间,以及更大的空间,由于List除了初始化内部的items外还须要初始化一些其余的属性。并且在方法调用时,这点我没有证明,只是一个猜想,List须要的是再去调用Array的相关方法,所以也许会存在方法调用的时间消耗问题。
总结:若是初始化时肯定大小,那么就使用Array。若是初始化时不肯定大小,那么就使用List。固然,其实彻底能够本身去实现List中的数组扩充功能的,也许会更棒,由于咱们没有必要去将Array每次都扩充为原来的二倍。
Array相对于List还有个优点就是:多维数组比List的嵌套更容易理解,也就是说int[][](或者是int[,])要强于List<list>,也就说在类型肯定且多维的状况下,用Array要优于List。
2.dictionary和hashtable的区别
首先不少人都认同一个观点,说Dictionary<T1,T2>是HashTable的泛型版本,这一点在大体上是正确的。
Hashtable是线程安全的,而Dictionary明显不具有如此特性。
说到字典,咱们就不能不说其存储结构,他会根据Key经过Hash计算来获得其应存放的虚拟内存地址,这也是在哈希表中Key必须惟一的缘由,当咱们按照Key进行查找时,首先就是根据Key计算出其所存放的虚拟内存地址,去对应的内存地址找数据,获得其Value。这一点HashTable与其相同。
3.第一类是list和array,第二类是dictionary和hashtable对比
一样是集合,为何性能会有这样的差距。咱们要从存储结构和操做系统的原理谈起。
首先咱们清楚List<T>是对数组作了一层包装,咱们在数据结构上称之为线性表,而线性表的概念是,在内存中的连续区域,除了首节点和尾节点外,每一个节点都有着其惟一的前驱结点和后续节点。咱们在这里关注的是连续这个概念。
而HashTable或者Dictionary,他是根据Key而根据Hash算法分析产生的内存地址,所以在宏观上是不连续的,虽然微软对其算法也进行了很大的优化。
因为这样的不连续,在遍历时,Dictionary必然会产生大量的内存换页操做,而List只须要进行最少的内存换页便可,这就是List和Dictionary在遍历时效率差别的根本缘由。
Dictionary的存储空间问题,在Dictionary中,除了要存储咱们实际须要的Value外,还须要一个辅助变量Key,这就形成了内存空间的双重浪费。
并且在尾部插入时,List只须要在其原有的地址基础上向后延续存储便可,而Dictionary却须要通过复杂的Hash计算,这也是性能损耗的地方。
内容取自:http://blog.csdn.net/teresa502/article/details/8266878和http://www.cnblogs.com/kym/archive/2009/03/09/1406657.html 感谢大神们的教诲我大体了解了。而后是第一次乱抄,看的不顺直接看原文吧。