Dictionary、HashTable梗劫、List<T>享甸、Array的效率

首先這四個大致可以分為兩類截碴,第一類是 List 和 Array(數(shù)組),第二類是 Dictionary 和 Hashtable

  • List 和 Array(數(shù)組)

在初始化List之前最好對List初始化大小蛉威。在初始化 List 時日丹,List 會新建一個數(shù)組,然后把數(shù)組的長度設置為原來的二倍(如果原有的數(shù)組長度為0蚯嫌,那就默認將數(shù)組的長度設置為4)哲虾。List<T> 是對 Array 的進一步封裝,說得再直接點择示,可以理解 List<T> 為 Array 的可擴充版本束凑,然后擴展了一些方法。

List 是基于 Array 存在的栅盲,因此汪诉,在創(chuàng)建一個 List 對象時,需要耗費比 Array 相對更多的時間谈秫,以及更大的空間扒寄,因為 List 除了初始化內(nèi)部的 items 外還需要初始化一些其他的屬性。而且在方法調(diào)用時拟烫,List需要的是再去調(diào)用Array的相關方法该编,因此也許會存在方法調(diào)用的時間消耗問題。

如果初始化時確定大小硕淑,那么就使用 Array课竣。如果初始化時不確定大小,那么就使用 List置媳。當然于樟,其實完全可以自己去實現(xiàn)List中的數(shù)組擴充功能的,也許會更棒半开,因為我們沒有必要去將Array每次都擴充為原來的二倍隔披。

Array 相對于 List 還有個優(yōu)勢就是:多維數(shù)組比List的嵌套更容易理解赃份,也就是說 int[][](或者是 int[,] )要強于 List<list>寂拆,也就說在類型確定且多維的情況下,用 Array 要優(yōu)于 List抓韩。

  • Dictionary 和 Hashtable

首先很多人都認同一個觀點纠永,說Dictionary<T1,T2>是HashTable的泛型版本,這一點在大致上是正確的谒拴。

Hashtable 是線程安全的尝江,而 Dictionary 明顯不具備如此特性。單線程程序中推薦使用 Dictionary, 有泛型優(yōu)勢, 且讀取速度較快, 容量利用更充分英上。

Dictionary<T1,T2> 是根據(jù)插入的順序來遍歷炭序,但是 Hashtable 在插入時會打亂其位置啤覆。

HashTable 與 Dictionary 的存儲原理是相同的。 都是根據(jù) Key 通過 Hash 計算來得到其應存放的虛擬內(nèi)存地址惭聂,這也是在哈希表中 Key 必須唯一的原因窗声,當我們按照 Key 進行查找時,首先就是根據(jù) Key 計算出其所存放的虛擬內(nèi)存地址辜纲,去對應的內(nèi)存地址找數(shù)據(jù)笨觅,得到其 Value。

  • Dictionary 和 List

List<T> 是對數(shù)組做了一層包裝耕腾,我們在數(shù)據(jù)結構上稱之為線性表见剩,而線性表的概念是,在內(nèi)存中的連續(xù)區(qū)域扫俺,除了首節(jié)點和尾節(jié)點外苍苞,每個節(jié)點都有著其唯一的前驅(qū)結點和后續(xù)節(jié)點。我們在這里關注的是連續(xù)這個概念狼纬。

而 HashTable 或者 Dictionary柒啤,他是根據(jù) Key 而根據(jù) Hash 算法分析產(chǎn)生的內(nèi)存地址,因此在宏觀上是不連續(xù)的畸颅,雖然微軟對其算法也進行了很大的優(yōu)化担巩。

由于這樣的不連續(xù),在遍歷時没炒,Dictionary 必然會產(chǎn)生大量的內(nèi)存換頁操作涛癌,而List只需要進行最少的內(nèi)存換頁即可,這就是 List 和 Dictionary 在遍歷時效率差異的根本原因送火。而且在尾部插入時拳话,List 只需要在其原有的地址基礎上向后延續(xù)存儲即可,而 Dictionary 卻需要經(jīng)過復雜的 Hash
計算种吸,這也是性能損耗的地方弃衍。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市坚俗,隨后出現(xiàn)的幾起案子镜盯,更是在濱河造成了極大的恐慌,老刑警劉巖猖败,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件速缆,死亡現(xiàn)場離奇詭異,居然都是意外死亡恩闻,警方通過查閱死者的電腦和手機艺糜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人破停,你說我怎么就攤上這事翅楼。” “怎么了真慢?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵犁嗅,是天一觀的道長。 經(jīng)常有香客問我晤碘,道長褂微,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任园爷,我火速辦了婚禮宠蚂,結果婚禮上,老公的妹妹穿的比我還像新娘童社。我一直安慰自己求厕,他們只是感情好,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布扰楼。 她就那樣靜靜地躺著呀癣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪弦赖。 梳的紋絲不亂的頭發(fā)上项栏,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天,我揣著相機與錄音蹬竖,去河邊找鬼沼沈。 笑死,一個胖子當著我的面吹牛币厕,可吹牛的內(nèi)容都是我干的列另。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼旦装,長吁一口氣:“原來是場噩夢啊……” “哼页衙!你這毒婦竟也來了?” 一聲冷哼從身側響起阴绢,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤店乐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后旱函,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體响巢,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年棒妨,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡券腔,死狀恐怖伏穆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情纷纫,我是刑警寧澤枕扫,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站辱魁,受9級特大地震影響烟瞧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜染簇,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一参滴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧锻弓,春花似錦砾赔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至杂拨,卻和暖如春专普,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背弹沽。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工脆诉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人贷币。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓击胜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親役纹。 傳聞我的和親對象是個殘疾皇子偶摔,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容

  • 關于Mongodb的全面總結 MongoDB的內(nèi)部構造《MongoDB The Definitive Guide》...
    中v中閱讀 31,898評論 2 89
  • 借鑒宋代的基本龍的造型,創(chuàng)作的一只青蛟促脉。也是龍的一種辰斋,也許古代人看到的就是鱷魚吧。哈哈
    火云冠珠閱讀 1,022評論 0 0
  • 感恩節(jié)快樂! 感恩路旁仿,路漫長 總有說不完的故事 總有講不完的心聲 生命里總會遇到知心的貴人 在你開心藕夫,難過,艱難,...
    韓藝陽閱讀 281評論 1 1
  • 首先這新聞是真是假毅贮,或許只有當事人才清楚的妖,而其他人尤其網(wǎng)上的看客根本無從得知宏榕。至少我希望自己保持自己的初心,而不是...
    007小寶閱讀 331評論 1 2
  • 剛剛讀完《查令十字街84號》,心中感慨不已平夜,如果用作是讀后感歹袁,感慨的內(nèi)容又與這本書內(nèi)容并無什么相關屹篓,題目也...
    昀凡閱讀 300評論 1 3