C# ArrayList、HashSet、HashTable、List、Dictionary的區別

在C#中,數組因爲是固定長度的,因此經常不能知足咱們開發的需求。算法

因爲這種限制不方便,因此出現了ArrayList。數組

ArrayList、List<T>


ArrayList是可變長數組,你能夠將任意多的數據Add到ArrayList裏面。其內部維護的數組,當長度不足時,會自動擴容爲原來的兩倍。性能優化

可是ArrayList也有一個缺點,就是存入ArrayList裏面的數據都是Object類型的,因此若是將值類型存入和取出的時候會發生裝箱、拆箱操做(就是值類型與引用類型之間的轉換),這個會影響程序性能。在.Net 2.0泛型出現之後,就提供了List<T>。數據結構

List<T>是ArrayList的泛型版本,它再也不須要裝箱拆箱,直接取,直接用,它基本與ArrayList一致,不過在使用的時候要先設置好它的類型,而設置好類型以後,不是這種類型的數據,是不容許Add進去的。性能

就性能來講,若是要存進數組的只有一種數據,那麼無疑List<T>是最優選擇。優化

List<int> ListInt = new List<int>();

若是一個變長數組,又要存int,又要存string。那麼就只能用ArrayList。.net

HashTable(哈希表)、Dictionary<T,T>


HashTable是一種根據key查找很是快的鍵值數據結構,不能有重複key,並且因爲其特色,其長度老是一個素數,因此擴容後容量會比2倍大一點點,加載因子爲0.72f。設計

當要大量使用key來查找value的時候,HashTable無疑是最有選擇,HashTable與ArrayList同樣,是非泛型的,value存進去是object,存取會發生裝箱、拆箱,因此出現了Dictionary<T,T>。code

Dictionary<T,T>是HashTable的泛型版本,存取一樣快,可是不須要裝箱和拆箱了。並且,其優化了算法,Hashtable是0.72,它的浪費容量少了不少。blog

Dictionary<string,Person> Dic = new Dictionary<string,Person>();

HashSet<T>


HashSet<T>類,算法,存儲結構都與哈希表相同,主要是設計用來作高性能集運算的,例如對兩個集合求交集、並集、差集等。集合中包含一組不重複出現且無特定順序的元素。

Queue、Queue<T>


Queue隊列,Queue<T>泛型隊列,大學都學過,隊列,先進先出,頗有用。

Stack、Stack<T>


Stack堆棧,先進後出。

SortedList、SortedList<TKey,TValue>


SortedList集合中的數據是有序的。能夠經過key來匹配數據,也能夠經過int下標來獲取數據。

添加操做比ArrayList,Hashtable略慢;查找、刪除操做比ArrayList快,比Hashtable慢。

SortedDictionary<TKey,TValue>


SortedDictionary<TKey,TValue>相比於SortedList<TKey,TValue>其性能優化了,SortedList<TKey,TValue>其內部維護的是數組而SortedDictionary<TKey,TValue>內部維護的是紅黑樹(平衡二叉樹)的一種,所以其佔用的內存,性能都好於SortedDictionary<TKey,TValue>。惟一差在不能用下標取值。

ListDictionary(單向鏈表),LinkedList<T>(雙向鏈表)


List<T>,ArrayList,Hashtable等容器類,其內部維護的是數組Array來,ListDictionary和LinkedList<T>不用Array,而是用鏈表的形式來保存。鏈表最大的好處就是節約內存空間。

ListDictionary是單向鏈表。

LinkedList<T>雙向鏈表。雙向鏈表的優點,能夠插入到任意位置。

HybridDictionary


HybridDictionary的類,充分利用了Hashtable查詢效率高和ListDictionary佔用內存空間少的優勢,內置了Hashtable和ListDictionary兩個容器,添加數據時內部邏輯以下:

當數據量小於8時,Hashtable爲null,用ListDictionary保存數據。

當數據量大於8時,實例化Hashtable,數據轉移到Hashtable中,而後將ListDictionary置爲null。

BitArray


BitArray這個東東是用於二進制運算,"或"、"非"、"與"、"異或非"等這種操做,只能存true或false;

應用場景


ArrayList,List<T>:變長數組;

HashTable,Dictionary<T,T>:頻繁根據key查找value;

HashSet<T>:集合運算;

Queue、Queue<T>:先進先出;

Stack、Stack<T>:堆棧,先進先出;

SortedList、SortedList<TKey,TValue>:哈希表,要經過下標,又要經過key取值時,可選用;

ListDictionary:單向鏈表,每次添加數據時都要遍歷鏈表,數據量大時效率較低,數據量較大且插入頻繁的狀況下,不宜選用。

LinkedList<T>:雙向鏈表;

HybridDictionary:未知數據量大小時,可用。

SortedDictionary<TKey,TValue>:SortedList<TKey,TValue>的優化版,內部數組轉平衡二叉樹。

BitArray:二進制運算時可選用;

 

引用於https://blog.csdn.net/wildlifeking/article/details/58605587

相關文章
相關標籤/搜索