基於昨天在羣裏討論的慘敗,今早特意睡不着就早早爬起來,鑽研前人對集合的理解,這文不少都是抄的,就當記憶記憶。
首先這四個大體能夠分爲兩類,第一類是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 感謝大神們的教誨我大體瞭解了。而後是第一次亂抄,看的不順直接看原文吧。