NSMutableArray和NSMutableDictionary的底層實現(xiàn)

NSMutableArray

數(shù)據(jù)結(jié)構(gòu)
  • _used 計數(shù)
  • _list 緩沖區(qū)指針
  • _size 緩沖區(qū)大小
  • _offset 緩沖區(qū)里的數(shù)組的第一個元素索引
    _NSArrayM使用的底層實現(xiàn)主要是“環(huán)形緩沖區(qū)”赵誓,這個數(shù)據(jù)結(jié)構(gòu)相當(dāng)簡單温圆,只是比常規(guī)數(shù)組或緩沖區(qū)復(fù)雜一點嚷量。環(huán)形緩沖區(qū)的內(nèi)容能在到達任意一端時繞向另一端取逾。
插入/刪除

環(huán)形緩沖區(qū)在未滿的情況下插入或刪除數(shù)據(jù),不會要求移動任何內(nèi)存箕母。在任意一端插入或者刪除储藐,只是修改offset參數(shù)俱济,不需要移動內(nèi)存。訪問數(shù)組元素的時候是通過index+offset來定位內(nèi)存地址的钙勃。插入數(shù)組中間時蛛碌,環(huán)形結(jié)構(gòu)會根據(jù)最少移動內(nèi)存的指針插入(_NSArrayM試著去最小化內(nèi)存的移動,因此會移動最少的一邊元素)辖源。

與此類似蔚携,在刪除頭部元素的時候,也只是需要修改offset克饶。在刪除中間元素時酝蜒,也只是會移動最少的一邊元素。

與C風(fēng)格數(shù)組對比

NSMutableArray是一個高級抽象數(shù)組矾湃,解決了C風(fēng)格數(shù)組對應(yīng)的缺點(C數(shù)組插入的時候都會移動內(nèi)存亡脑,不是O(1)),用到了環(huán)形緩沖區(qū)數(shù)據(jù)結(jié)構(gòu)來處理內(nèi)存移動的損耗邀跃。而NSMutableArray在任意一端插入或刪除的時候有固定時間的性能霉咨,而在中間插入/刪除的時候都會試著去移動最小化內(nèi)存。

優(yōu)化

環(huán)形緩沖區(qū)的數(shù)據(jù)結(jié)構(gòu)如果是連續(xù)數(shù)組結(jié)構(gòu)拍屑,在擴容的時候需要移動大量內(nèi)存途戒,從這個角度看,用鏈表實現(xiàn)環(huán)形緩沖更好丽涩。

NSMutableDictionary

數(shù)據(jù)結(jié)構(gòu)
  • _base
  • _count
  • _capacity 擴充閾值
  • _bucketsNum
  • _marker
  • _context
  • _deletes
  • _xflags
  • _keys
  • _values
底層實現(xiàn)

NSDictionary底層其實是一個哈希表。根據(jù)數(shù)據(jù)結(jié)構(gòu)可以發(fā)現(xiàn)NSDictionary內(nèi)部使用了兩個數(shù)組分別來保存keys和values裁蚁。
NSDictionary采用連續(xù)存儲的方式存儲鍵值對矢渊,并由兩個數(shù)組分別存儲。key哈希出來數(shù)組的下標(biāo)地址枉证,同樣的這個地址對應(yīng)到values數(shù)組的下標(biāo)矮男,就是匹配到的值。因此keys和values這兩個數(shù)組的長度一致才能保證匹配到數(shù)據(jù)室谚。內(nèi)部結(jié)構(gòu)還有個_capacity表示當(dāng)前列表的擴充閾值毡鉴,當(dāng)count數(shù)量達到這個長度就擴容。

NSDictionary設(shè)置的key和value秒赤,key值會根據(jù)特定的hash函數(shù)算出建立的空桶數(shù)組猪瞬,keys和values同樣多,然后存儲數(shù)據(jù)的時候入篮,根據(jù)hash函數(shù)算出來的值陈瘦,找到對應(yīng)的index下標(biāo)。如果下標(biāo)已有數(shù)據(jù)潮售,開放定址法后移動插入痊项。如果空桶數(shù)組的數(shù)量達到數(shù)據(jù)閾值锅风,這個時候就把空桶數(shù)組擴容,然后重新哈希插入鞍泉。

這樣把一些不連續(xù)的key-value值插入到能建立起關(guān)系的hash表中皱埠,當(dāng)我們查找的時候,key根據(jù)哈希值算出來咖驮,然后根據(jù)索引边器,直接index訪問hash表的hash和values,這樣查詢速度就可以和連續(xù)線性存儲的數(shù)據(jù)一樣接近O(1)了游沿,只是占用空間有點大饰抒。刪除的時候,根據(jù)marker標(biāo)記邏輯上的刪除诀黍,除非NSDictionary內(nèi)存被移除袋坑。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市眯勾,隨后出現(xiàn)的幾起案子枣宫,更是在濱河造成了極大的恐慌,老刑警劉巖吃环,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件也颤,死亡現(xiàn)場離奇詭異,居然都是意外死亡郁轻,警方通過查閱死者的電腦和手機翅娶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來好唯,“玉大人竭沫,你說我怎么就攤上這事∑锔荩” “怎么了蜕提?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長靶端。 經(jīng)常有香客問我谎势,道長,這世上最難降的妖魔是什么杨名? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任脏榆,我火速辦了婚禮,結(jié)果婚禮上台谍,老公的妹妹穿的比我還像新娘姐霍。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布镊折。 她就那樣靜靜地躺著胯府,像睡著了一般。 火紅的嫁衣襯著肌膚如雪恨胚。 梳的紋絲不亂的頭發(fā)上骂因,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天,我揣著相機與錄音赃泡,去河邊找鬼寒波。 笑死,一個胖子當(dāng)著我的面吹牛升熊,可吹牛的內(nèi)容都是我干的俄烁。 我是一名探鬼主播,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼级野,長吁一口氣:“原來是場噩夢啊……” “哼页屠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蓖柔,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤辰企,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后况鸣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體牢贸,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年镐捧,在試婚紗的時候發(fā)現(xiàn)自己被綠了潜索。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡懂酱,死狀恐怖竹习,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情玩焰,我是刑警寧澤由驹,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布芍锚,位于F島的核電站昔园,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏并炮。R本人自食惡果不足惜默刚,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望逃魄。 院中可真熱鬧荤西,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至觅丰,卻和暖如春饵溅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背妇萄。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工蜕企, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人冠句。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓轻掩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親懦底。 傳聞我的和親對象是個殘疾皇子唇牧,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,700評論 2 345