詳解如何選擇使用ArrayList、HashTable、List、Dictionary數(shù)組
在C#中,數(shù)組由于是固定長度的,所以常常不能滿足我們開發(fā)的需求。
由于這種限制不方便,所以出現(xiàn)了ArrayList。
ArrayList、List<T>
ArrayList是可變長數(shù)組,你可以將任意多的數(shù)據(jù)Add到ArrayList里面。其內(nèi)部維護的數(shù)組,當長度不足時,會自動擴容為原來的兩倍。
但是ArrayList也有一個缺點,就是存入ArrayList里面的數(shù)據(jù)都是Object類型的,所以如果將值類型存入和取出的時候會發(fā)生裝箱、拆箱操作(就是值類型與引用類型之間的轉(zhuǎn)換),這個會影響程序性能。在.Net 2.0泛型出現(xiàn)以后,就提供了List<T>。
List<T>是ArrayList的泛型版本,它不再需要裝箱拆箱,直接取,直接用,它基本與ArrayList一致,不過在使用的時候要先設(shè)置好它的類型,而設(shè)置好類型之后,不是這種類型的數(shù)據(jù),是不允許Add進去的。
就性能來說,如果要存進數(shù)組的只有一種數(shù)據(jù),那么無疑List<T>是最優(yōu)選擇。
List<int> ListInt = new List<int>();
如果一個變長數(shù)組,又要存int,又要存string。那么就只能用ArrayList。
HashTable(哈希表)、Dictionary<T,T>
HashTable是一種根據(jù)key查找非??斓逆I值數(shù)據(jù)結(jié)構(gòu),不能有重復(fù)key,而且由于其特點,其長度總是一個素數(shù),所以擴容后容量會比2倍大一點點,加載因子為0.72f。
當要大量使用key來查找value的時候,HashTable無疑是最有選擇,HashTable與ArrayList一樣,是非泛型的,value存進去是object,存取會發(fā)生裝箱、拆箱,所以出現(xiàn)了Dictionary<T,T>。
Dictionary<T,T>是HashTable的泛型版本,存取同樣快,但是不需要裝箱和拆箱了。而且,其優(yōu)化了算法,Hashtable是0.72,它的浪費容量少了很多。
Dictionary<string,Person> Dic = new Dictionary<string,Person>();
HashSet<T>
HashSet<T>類,算法,存儲結(jié)構(gòu)都與哈希表相同,主要是設(shè)計用來做高性能集運算的,例如對兩個集合求交集、并集、差集等。集合中包含一組不重復(fù)出現(xiàn)且無特定順序的元素。
Queue、Queue<T>
Queue隊列,Queue<T>泛型隊列,大學(xué)都學(xué)過,隊列,先進先出,很有用。
Stack、Stack<T>
Stack堆棧,先進后出。
SortedList、SortedList<TKey,TValue>
SortedList集合中的數(shù)據(jù)是有序的??梢酝ㄟ^key來匹配數(shù)據(jù),也可以通過int下標來獲取數(shù)據(jù)。
添加操作比ArrayList,Hashtable略慢;查找、刪除操作比ArrayList快,比Hashtable慢。
SortedDictionary<TKey,TValue>
SortedDictionary<TKey,TValue>相比于SortedList<TKey,TValue>其性能優(yōu)化了,SortedList<TKey,TValue>其內(nèi)部維護的是數(shù)組而SortedDictionary<TKey,TValue>內(nèi)部維護的是紅黑樹(平衡二叉樹)的一種,因此其占用的內(nèi)存,性能都好于SortedDictionary<TKey,TValue>。唯一差在不能用下標取值。
ListDictionary(單向鏈表),LinkedList<T>(雙向鏈表)
List<T>,ArrayList,Hashtable等容器類,其內(nèi)部維護的是數(shù)組Array來,ListDictionary和LinkedList<T>不用Array,而是用鏈表的形式來保存。鏈表最大的好處就是節(jié)約內(nèi)存空間。
ListDictionary是單向鏈表。
LinkedList<T>雙向鏈表。雙向鏈表的優(yōu)勢,可以插入到任意位置。
HybridDictionary
HybridDictionary的類,充分利用了Hashtable查詢效率高和ListDictionary占用內(nèi)存空間少的優(yōu)點,內(nèi)置了Hashtable和ListDictionary兩個容器,添加數(shù)據(jù)時內(nèi)部邏輯如下:
當數(shù)據(jù)量小于8時,Hashtable為null,用ListDictionary保存數(shù)據(jù)。
當數(shù)據(jù)量大于8時,實例化Hashtable,數(shù)據(jù)轉(zhuǎn)移到Hashtable中,然后將ListDictionary置為null。
BitArray
BitArray這個東東是用于二進制運算,"或"、"非"、"與"、"異或非"等這種操作,只能存true或false;
應(yīng)用場景
ArrayList,List<T>:變長數(shù)組;
HashTable,Dictionary<T,T>:頻繁根據(jù)key查找value;
HashSet<T>:集合運算;
Queue、Queue<T>:先進先出;
Stack、Stack<T>:堆棧,先進先出;
SortedList、SortedList<TKey,TValue>:哈希表,要通過下標,又要通過key取值時,可選用;
ListDictionary:單向鏈表,每次添加數(shù)據(jù)時都要遍歷鏈表,數(shù)據(jù)量大時效率較低,數(shù)據(jù)量較大且插入頻繁的情況下,不宜選用。
LinkedList<T>:雙向鏈表;
HybridDictionary:未知數(shù)據(jù)量大小時,可用。
SortedDictionary<TKey,TValue>:SortedList<TKey,TValue>的優(yōu)化版,內(nèi)部數(shù)組轉(zhuǎn)平衡二叉樹。
BitArray:二進制運算時可選用;
以上所述是本文的全部內(nèi)容,希望對大家有所幫助!
上一篇:c#中SqlTransaction——事務(wù)詳解
欄 目:C#教程
本文標題:詳解如何選擇使用ArrayList、HashTable、List、Dictionary數(shù)組
本文地址:http://www.jygsgssxh.com/a1/C_jiaocheng/6161.html
您可能感興趣的文章
- 01-10Extjs4如何處理后臺json數(shù)據(jù)中日期和時間
- 01-10asp.net中XML如何做增刪改查操作
- 01-10C#中Socket通信用法實例詳解
- 01-10C#裝箱和拆箱原理詳解
- 01-10C#類的多態(tài)性詳解
- 01-10C#創(chuàng)建不規(guī)則窗體的4種方式詳解
- 01-10C#中深度復(fù)制和淺度復(fù)制詳解
- 01-10C#.NET中如何批量插入大量數(shù)據(jù)到數(shù)據(jù)庫中
- 01-10C#數(shù)據(jù)結(jié)構(gòu)之隊列(Quene)實例詳解
- 01-10C#數(shù)據(jù)結(jié)構(gòu)之順序表(SeqList)實例詳解


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實現(xiàn)txt定位指定行完整實例
- 01-10WinForm實現(xiàn)仿視頻播放器左下角滾動新
- 01-10C#停止線程的方法
- 01-10C#實現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實現(xiàn)讀取注冊表監(jiān)控當前操作系統(tǒng)已
隨機閱讀
- 01-10delphi制作wav文件的方法
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 04-02jquery與jsp,用jquery
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-10C#中split用法實例總結(jié)
- 01-10使用C語言求解撲克牌的順子及n個骰子


