1. 程式人生 > >C# 集合型別(常用集合型別整理)

C# 集合型別(常用集合型別整理)

一、常用集合型別及概念

1.基本關係

許多泛型集合型別均為非泛型型別的直接模擬。

Dictionary< TKey, TValue> 是 Hashtable 的泛型版本;它使用列舉的泛型結構KeyValuePair< TKey, TValue> 而不是DictionaryEntry

List< T> 是 ArrayList 的泛型版本
Queue< T>對應Queue
Stack< T>對應Stack

SortedList< TKey, TValue> 對應SortedList,這兩個版本均為字典和列表的混合

SortedDictionary< TKey, TValue> 泛型類是一個純字典,並且沒有任何非泛型對應項

LinkedList< T>泛型類是真正的連結的列表,並具有任何非泛型對應項

2.常用集合型別

1)ArrayList

ArrayList是List介面的可變陣列非同步實現,並允許包括null在內的所有元素,相當於List < object>

2)List < T >

泛型的List 類是一個不限長度的集合型別,它內部實際就是一個數組,初始長度是4,每次陣列到達限制,就會把現有容量翻倍,它提供用於對集合進行搜尋、排序和操作等方法
List是陣列連結串列,陣列連結串列訪問快,複雜度O(1),但是新增刪除複雜度O(n)

3)LinkedList

LinkedList是List介面的雙向連結串列非同步實現,並允許包括null在內的所有元素。
底層的資料結構是基於雙向連結串列的,
LinkedList是指標連結串列,指標連結串列訪問複雜度是O(n),但是新增刪除很快O(1),如果對這個集合在中間的新增刪除操作非常頻繁的話,就建議使用LinkedList。

4)Dictionary < K, V>

儲存鍵值對的關聯性集合,查詢等操作速度很快,因為它的時間複雜度是O(1)
,單執行緒中推薦使用Dictionary,有泛型優勢,且讀取速度較快,容量利用更充分.

5)Hashtable

Hashtable是System.Collections名稱空間提供的一個容器,用於處理和表現類似key/value的鍵值對
基本概念
Hashtable使用了閉雜湊法來解決衝突,它通過一個結構體bucket來表示雜湊表中的單個元素,這個結構體中有三個成員:
 (1) key :表示鍵,即雜湊表中的關鍵字。
 (2) val :表示值,即跟關鍵字所對應值。
 (3) hash_coll :它是一個int型別,用於表示鍵所對應的雜湊碼。

雜湊表的所有元素存放於一個名稱為buckets(又稱為資料桶) 的bucket陣列之中
優點:
 (1)在使用雜湊表儲存集合元素(一種鍵/值對)時,首先要根據鍵自動計算雜湊程式碼,以確定該元素的儲存位置,再把元素的值放入相應位置所指向的儲存桶中。在查詢時,再次通過鍵所對應的雜湊程式碼到特定儲存桶中搜索,這樣將大大減少為查詢一個元素進行比較的次數

 (2)多執行緒程式中推薦使用Hashtable,對Hashtable進一步呼叫Synchronized()方法可以獲得完全執行緒安全的型別

Dictionary< TKey, TValue> 是 Hashtable 的泛型版本,它們之間實現上區別不大,執行效率上有一些差別
Hashtable由於鍵值型別都object,所以涉及裝箱拆箱操作,在新增資料的效率上要差一些,但是頻繁使用資料時效率更高,HashTable的優點就在於其索引的方式,速度非常快。如果以任意型別鍵值訪問其中元素會快於其他集合,特別是當資料量特別大的時候,效率差別尤其大。

6)SortedList

表示基於相關的 IComparer 實現按鍵進行排序的鍵/值對的集合,與雜湊表類似,區別在於SortedList中的Key陣列排好序的

7)堆疊(Stack)

表示物件的簡單的後進先出非泛型集合。Push方法入棧,Pop方法出棧

8)佇列(Queue)

佇列先進先出,enqueue方法入佇列,dequeue方法出佇列

9)SortedList< TKey,TValue>

  SortedList< TKey,TValue>是支援排序的關聯性集合,將資料儲存在陣列中的。
  也就是說新增移除操作都是線性的,時間複雜度是O(n),因為操作其中的元素可能導致所有的資料移動。
  但是因為在查詢的時候利用了二分搜尋,所以查詢的效能會好一些,時間複雜度是O(log n)
  所以推薦使用場景是這樣地:如果你想要快速查詢,又想集合按照key的順序排列,最後這個集合的操作(新增和移除)比較少的話,就是SortedList了。
  集合中的資料是有序的。可以通過key來匹配資料,也可以通過int下標來獲取資料。

新增操作比ArrayList,Hashtable略慢;查詢、刪除操作比ArrayList快,比Hashtable慢

10)SortedDictioanry< TKey,TValue>

  SortedDictionary< TKey,TValue>和Dictionary< TKey,TValue>大致上是類似的,但是在實現方式上有一點點區別
  SortedDictionary< TKey,TValue>用二叉樹作為儲存結構的。並且按key的順序排列
  SortedDictionary< TKey,TValue>相比於SortedList< TKey,TValue>其效能優化了
  SortedList< TKey,TValue>其內部維護的是陣列而SortedDictionary< TKey,TValue>內部維護的是紅黑樹(平衡二叉樹)的一種,因此其佔用的記憶體,效能都好於SortedDictionary< TKey,TValue>
  唯一差在不能用下標取值

11)HashSet< T>

  HashSet是一個無序的能夠保持唯一性的集合,不支援下標訪問。

12)SortedSet< T>

  SortedSet內部也是一個二叉樹,用來支援按順序的排列元素。
  演算法,儲存結構都與雜湊表相同,主要是設計用來做高效能集運算的,例如對兩個集合求交集、並集、差集等。集合中包含一組不重複出現且無特定順序的元素。

13)BitArray

  BitArray用於二進位制運算,”或”、”非”、”與”、”異或非”等這種操作,只能存true或false;

14)ListDictionary

  單向連結串列,每次新增資料時都要遍歷連結串列,資料量大時效率較低,資料量較大且插入頻繁的情況下,不宜選用

15)HybridDictionary

  HybridDictionary的類,充分利用了Hashtable查詢效率高和ListDictionary佔用記憶體空間少的優點,內建了Hashtable和ListDictionary兩個容器,新增資料時內部邏輯如下:

  當資料量小於8時,Hashtable為null,用ListDictionary儲存資料。

  當資料量大於8時,例項化Hashtable,資料轉移到Hashtable中,然後將  ListDictionary置為null。

下一篇再寫一下每一種集合的內部實現,及具體的執行效率比較