欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解如何選擇使用ArrayList、HashTable、List、Dictionary數(shù)組

 更新時(shí)間:2016年11月21日 10:54:39   作者:逆心  
本文詳細(xì)介紹了ArrayList、HashTable、List、Dictionary的用法,以及什么情況選用該數(shù)組,以便提高開(kāi)發(fā)效率。希望對(duì)大家有所幫助

在C#中,數(shù)組由于是固定長(zhǎng)度的,所以常常不能滿足我們開(kāi)發(fā)的需求。

由于這種限制不方便,所以出現(xiàn)了ArrayList。

ArrayList、List<T>

ArrayList是可變長(zhǎng)數(shù)組,你可以將任意多的數(shù)據(jù)Add到ArrayList里面。其內(nèi)部維護(hù)的數(shù)組,當(dāng)長(zhǎng)度不足時(shí),會(huì)自動(dòng)擴(kuò)容為原來(lái)的兩倍。

但是ArrayList也有一個(gè)缺點(diǎn),就是存入ArrayList里面的數(shù)據(jù)都是Object類型的,所以如果將值類型存入和取出的時(shí)候會(huì)發(fā)生裝箱、拆箱操作(就是值類型與引用類型之間的轉(zhuǎn)換),這個(gè)會(huì)影響程序性能。在.Net 2.0泛型出現(xiàn)以后,就提供了List<T>。

List<T>是ArrayList的泛型版本,它不再需要裝箱拆箱,直接取,直接用,它基本與ArrayList一致,不過(guò)在使用的時(shí)候要先設(shè)置好它的類型,而設(shè)置好類型之后,不是這種類型的數(shù)據(jù),是不允許Add進(jìn)去的。

就性能來(lái)說(shuō),如果要存進(jìn)數(shù)組的只有一種數(shù)據(jù),那么無(wú)疑List<T>是最優(yōu)選擇。

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

如果一個(gè)變長(zhǎng)數(shù)組,又要存int,又要存string。那么就只能用ArrayList。

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

HashTable是一種根據(jù)key查找非常快的鍵值數(shù)據(jù)結(jié)構(gòu),不能有重復(fù)key,而且由于其特點(diǎn),其長(zhǎng)度總是一個(gè)素?cái)?shù),所以擴(kuò)容后容量會(huì)比2倍大一點(diǎn)點(diǎn),加載因子為0.72f。

當(dāng)要大量使用key來(lái)查找value的時(shí)候,HashTable無(wú)疑是最有選擇,HashTable與ArrayList一樣,是非泛型的,value存進(jìn)去是object,存取會(huì)發(fā)生裝箱、拆箱,所以出現(xiàn)了Dictionary<T,T>。

Dictionary<T,T>是HashTable的泛型版本,存取同樣快,但是不需要裝箱和拆箱了。而且,其優(yōu)化了算法,Hashtable是0.72,它的浪費(fèi)容量少了很多。

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

HashSet<T>

HashSet<T>類,算法,存儲(chǔ)結(jié)構(gòu)都與哈希表相同,主要是設(shè)計(jì)用來(lái)做高性能集運(yùn)算的,例如對(duì)兩個(gè)集合求交集、并集、差集等。集合中包含一組不重復(fù)出現(xiàn)且無(wú)特定順序的元素。

Queue、Queue<T>

Queue隊(duì)列,Queue<T>泛型隊(duì)列,大學(xué)都學(xué)過(guò),隊(duì)列,先進(jìn)先出,很有用。

Stack、Stack<T>

Stack堆棧,先進(jìn)后出。

SortedList、SortedList<TKey,TValue>

SortedList集合中的數(shù)據(jù)是有序的??梢酝ㄟ^(guò)key來(lái)匹配數(shù)據(jù),也可以通過(guò)int下標(biāo)來(lái)獲取數(shù)據(jù)。

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

SortedDictionary<TKey,TValue>

SortedDictionary<TKey,TValue>相比于SortedList<TKey,TValue>其性能優(yōu)化了,SortedList<TKey,TValue>其內(nèi)部維護(hù)的是數(shù)組而SortedDictionary<TKey,TValue>內(nèi)部維護(hù)的是紅黑樹(shù)(平衡二叉樹(shù))的一種,因此其占用的內(nèi)存,性能都好于SortedDictionary<TKey,TValue>。唯一差在不能用下標(biāo)取值。

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

List<T>,ArrayList,Hashtable等容器類,其內(nèi)部維護(hù)的是數(shù)組Array來(lái),ListDictionary和LinkedList<T>不用Array,而是用鏈表的形式來(lái)保存。鏈表最大的好處就是節(jié)約內(nèi)存空間。

ListDictionary是單向鏈表。

LinkedList<T>雙向鏈表。雙向鏈表的優(yōu)勢(shì),可以插入到任意位置。

HybridDictionary

HybridDictionary的類,充分利用了Hashtable查詢效率高和ListDictionary占用內(nèi)存空間少的優(yōu)點(diǎn),內(nèi)置了Hashtable和ListDictionary兩個(gè)容器,添加數(shù)據(jù)時(shí)內(nèi)部邏輯如下:

當(dāng)數(shù)據(jù)量小于8時(shí),Hashtable為null,用ListDictionary保存數(shù)據(jù)。

當(dāng)數(shù)據(jù)量大于8時(shí),實(shí)例化Hashtable,數(shù)據(jù)轉(zhuǎn)移到Hashtable中,然后將ListDictionary置為null。

BitArray

BitArray這個(gè)東東是用于二進(jìn)制運(yùn)算,"或"、"非"、"與"、"異或非"等這種操作,只能存true或false;

應(yīng)用場(chǎng)景

ArrayList,List<T>:變長(zhǎng)數(shù)組;

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

HashSet<T>:集合運(yùn)算;

Queue、Queue<T>:先進(jìn)先出;

Stack、Stack<T>:堆棧,先進(jìn)先出;

SortedList、SortedList<TKey,TValue>:哈希表,要通過(guò)下標(biāo),又要通過(guò)key取值時(shí),可選用;

ListDictionary:?jiǎn)蜗蜴湵?,每次添加?shù)據(jù)時(shí)都要遍歷鏈表,數(shù)據(jù)量大時(shí)效率較低,數(shù)據(jù)量較大且插入頻繁的情況下,不宜選用。

LinkedList<T>:雙向鏈表;

HybridDictionary:未知數(shù)據(jù)量大小時(shí),可用。

SortedDictionary<TKey,TValue>:SortedList<TKey,TValue>的優(yōu)化版,內(nèi)部數(shù)組轉(zhuǎn)平衡二叉樹(shù)。

BitArray:二進(jìn)制運(yùn)算時(shí)可選用;

以上所述是本文的全部?jī)?nèi)容,希望對(duì)大家有所幫助!

相關(guān)文章

  • 深入C# 4.0 新特性dynamic、可選參數(shù)、命名參數(shù)的詳細(xì)介紹

    深入C# 4.0 新特性dynamic、可選參數(shù)、命名參數(shù)的詳細(xì)介紹

    本篇文章是對(duì)C# 4.0 新特性dynamic、可選參數(shù)、命名參數(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C#給Excel添加水印實(shí)例詳解

    C#給Excel添加水印實(shí)例詳解

    這篇文章主要介紹了C#給Excel添加水印實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2016-09-09
  • unity實(shí)現(xiàn)文字滾動(dòng)效果

    unity實(shí)現(xiàn)文字滾動(dòng)效果

    這篇文章主要為大家詳細(xì)介紹了unity實(shí)現(xiàn)文字滾動(dòng)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-02-02
  • C#開(kāi)發(fā)答題贏錢(qián)游戲(自動(dòng)答題器)

    C#開(kāi)發(fā)答題贏錢(qián)游戲(自動(dòng)答題器)

    現(xiàn)在最火的直播游戲,那就是答題贏錢(qián)直播了,如百萬(wàn)英雄、芝士超人、花椒直播、沖頂大會(huì)等等,這些游戲的玩法都很簡(jiǎn)單,答對(duì)12題即可瓜分獎(jiǎng)金了。玩法雖簡(jiǎn)單但是完全答對(duì)12題難度就挺高了,下面小編給大家?guī)?lái)了C#開(kāi)發(fā)答題贏錢(qián)游戲,需要的朋友參考下吧
    2018-01-01
  • ItemsControl 數(shù)據(jù)綁定的兩種方式

    ItemsControl 數(shù)據(jù)綁定的兩種方式

    這篇文章主要介紹了ItemsControl 數(shù)據(jù)綁定的兩種方式,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-03-03
  • WPF中使用CallerMemberName簡(jiǎn)化InotifyPropertyChanged的實(shí)現(xiàn)

    WPF中使用CallerMemberName簡(jiǎn)化InotifyPropertyChanged的實(shí)現(xiàn)

    這篇文章介紹了WPF中使用CallerMemberName簡(jiǎn)化InotifyPropertyChanged的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • 淺析泛型類接口定義

    淺析泛型類接口定義

    在使用泛型定義類的過(guò)程中遇到了不少問(wèn)題,特記錄如下,需要的朋友可以參考下
    2013-07-07
  • C#操作XML文件步驟

    C#操作XML文件步驟

    在本篇文章里小編給大家分享了關(guān)于C#操作XML文件步驟教學(xué)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2019-01-01
  • C#引用類型和值類型的介紹與實(shí)例

    C#引用類型和值類型的介紹與實(shí)例

    這篇文章主要介紹了C#引用類型和值類型,有需要的朋友可以參考一下
    2013-12-12
  • C#利用iTextSharp組件給PDF文檔添加圖片/文字水印

    C#利用iTextSharp組件給PDF文檔添加圖片/文字水印

    這篇文章主要給大家介紹了關(guān)于如何C#利用iTextSharp組件給PDF文檔添加圖片/文字水印的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10

最新評(píng)論