C#常見幾種集合比較


1. ArrayList

1.1 ArrayList是一個特殊數組,通過添加和刪除元素就可以動態改變數組的長度。

ArrayList集合相對於數組的優點:支持自動改變大小,可以靈活的插入元素,可以靈活的刪除元素,可以靈活的訪問元素,但是ArrayList只支持一維,並且查詢和檢索的。

1.2 速度比較慢。

在C#中數據類型分為兩類:值類型和引用類型。int bool char double enum struct DateTime等都是值類型(值類型和引用類型的重要特征在於,值類型的長度固定,而引用類型的長度不固定),string Array class集合 等都是引用類型。如果是值類型直接存儲在棧中(局部變量),如果是引用類型,先把數據存儲在堆中,然后把堆的地址存儲在棧中。
object類是所有類的基類,所有的數據類型都可以轉換成object類,這就是為什么ArrayList可以存儲值類型和引用類型,因為在存儲的時候全被轉換成object類型存儲這也是ArrayList的一個缺點,就是存儲的時候需要把值類型封裝成object類型,取出來的時候需要再把object類型再轉換成值類型,這一裝箱和拆箱的過程非常消耗性能。
裝箱:如果往ArrayList中存儲值類型的數據,在存儲的時候需要轉換成object類型存儲,由值類型封裝成object類型的過程稱為裝箱。
拆箱:由object類型轉換成值類型的過程稱為拆箱。

2. List

繼承了ArrayList的特點,但是聲明時需要指定類型,減少了裝箱拆箱操作,提升了性能。
有索引,可以進行排序,修改等等。

3. LinkedList(鏈表)

ArrayList或者List都有個缺陷,插入元素或者移除元素時速度較慢,因為存在后續元素的位置變化。
LinkedList每個元素記錄下一個元素的位置,那么就插入或者移除元素時只需要修改標記即可,不用移動后面的元素了,大大提高了效率。

ArrayList vs List vs LinkedList: 盡量避免使用ArrayList,多線程時候可以用ConcurrentBag。
==插入、刪除較多用LinkedList,否則用List == 包(Bag)包可包含重復元素(此處對應List)。
集(Set)集中不能包含重復元素。

4. HashTable

4.1 key-value組合,可以添加不同類型的數據,取出之后需要轉換成對應類型

  Hashtable hashtable = new Hashtable();        hashtable.Add("名字", "小麗");   hashtable.Add("年齡", 22);   return hashtable; 

4.2 HashTable線程安全,允許單線程寫入,多線程讀取。

5. Dictionary

5.1 key-value組合,必須指定數據類型

5.2 速度較快,不必裝箱拆箱

5.3 非線程安全(即使這樣,也可以用ConcurrentDictionary代替)

HashTable vs Dictionary :
Dictionary效率高,但是人為lock保持線程安全時效率反而低下。 多線程編程需要ConcurrentDictionary,單線程需要Dictionary。
優化小技巧:由於Dictionary有底層有桶和鏈表結構,有時候將List轉為Dictionary進行操作(用主鍵作為key),反而效率更高。

插入性能:List < HashTable < Dictionary < LinkedList
遍歷性能:HashTable < Dictionary < LinkedList < List
刪除性能:List < HashTable < LinkedList < Dictionary

5. Queue

隊列:先進先出(FIFO)

6. Stak

棧:后進先出(LIFO)

7. HashSet<T>和SortedSet<T>

7.1 都屬於集(Set:元素不可重復),加入重復元素時並不會報錯。SortedSet還有排序的功能,例如加入1、3、2,foreach會得到1、2、3


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM