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。
下一篇再寫一下每一種集合的內部實現,及具體的執行效率比較