System.Collections.Generic 源碼閱讀總結

ArrayList ,List

ArrayList 和 List 都是不限制長度的集合類型 ,List相比ArrayList 就內部實現而言除了泛型本質沒有太大區別。不過爲避免裝箱拆箱問題,儘量使用List算法

集合內部是由數組實現,默認大小是4,但你使用無參構造函數構造實例時,內部數組大小是0,當你加入第一個元素時,才擴容爲4,添加元素時,若是發現內置數組大小不夠,內置數組大小會擴容爲原來的兩倍,每一次擴容都會從新開闢一個數組,拷貝舊數組的數據,若是你要給集合添加大量的元素卻不爲它初始化一個合適容量,頻繁的內存開闢和多餘的數組拷貝會致使性能的損耗。c#

因此使用時建議提供合適的容量。數組

hashtable,Dictionary

hashtable和Dictionary都是哈希表的實現,不少人說Dictionary內部是由hashtable實現的,這是不恰當的。數據結構

hashtable的構造須要裝載因子,裝載因子是0.1 到 1.0 範圍內的數字 ,是內部存儲桶數(count)所佔桶數組(buckets)桶數(hashsize)的最大比率 ,當桶數大於裝載數(loadsize)時,桶數組就會擴容函數

hashtable內部解除哈希衝突的算法是雙重散列法,是開放地址法中最好的方法之一性能

而不一樣的是,Dictionary內部解除哈希衝突的算法是鏈地址法,並且Dictionary的構造不須要裝載因子,不受裝載因子的限制 ,若是Dictionary很是小,查找,插入,刪除等操做擁有近乎O(1)的效率code

和ArrayList ,List相似的是Dictionary和hashtable內部也是由數組實現的,因此構造時也須要提供合適容量,防止性能的損耗。對象

但咱們須要另外注意的是你提供給構造函數的容量不必定會是初始時內置數組的長度,構造函數內部會選擇一個大於等於你所選擇容量的素數做爲真實的初始容量。排序

HashSet

HashSet是一個無序的可以保持惟一性的集合。咱們也能夠把HashSet看做是Dictionary<TKey,TValue>,只不過TKey和TValue都指向同一個對象。內部實現和Dictionary很是類似。 HashSet很是適合在咱們須要保持集合內元素惟一性但又不須要按順序排列的時候。內存

SortedList

SortedList是支持排序的關聯性(鍵值對 )集合 ,內部採用數組實現,因此和List相同的是,初始化時須要提供一個合適的容量,SortedList內部採用哈希算法實現,和Dictionary相似的是,SortedList內部解除哈希衝突的算法是鏈地址法。

由於在查找的時候利用了二分搜索,因此查找的性能會好一些,時間複雜度是O(log n)

若是你想要快速查找,又想集合按照key的順序排列,最後這個集合的操做(添加和移除)比較少的話,就是SortedList了

SortedSet,SortedDictioanry

SortedSet相似於HashSet,但略有不一樣的是,SortedSet是有序排列,SortedSet內部實現應該是全部集合中最複雜,是依靠紅黑樹的原理實現。

SortedDictioanry和Dictionary的區別與HashSet和SortedSet的區別基本一致,由於SortedDictioanry內部自己就是依靠SortedSet實現的,而且SortDictionary內部順序是以key的順序爲排列的

public SortedDictionary(IDictionary<TKey,TValue> dictionary, IComparer<TKey> comparer) {
          if( dictionary == null) {
              ThrowHelper.ThrowArgumentNullException(ExceptionArgument.dictionary);
          }
 
          _set = new TreeSet<KeyValuePair<TKey, TValue>>(new KeyValuePairComparer(comparer));
 
          foreach(KeyValuePair<TKey, TValue> pair in dictionary) {
              _set.Add(pair);
          }            
      }

LinkedList,Stack,Queue

這3個集合我就很少作解釋,徹底按這幾個基礎數據結構的原理來實現。不過Stack,Queue內部採用數組實現,因此也要注意初始化時提供一個恰當的容量啊

相關文章
相關標籤/搜索