NSDictionary底層實(shí)現(xiàn)原理

3.NSDictionary底層實(shí)現(xiàn)原理

筆者自語:當(dāng)有一個面試官問我NSDictionary底層實(shí)現(xiàn)原理钱磅,我平時開發(fā)的時候只是會用而已,哪里知道它的內(nèi)部實(shí)現(xiàn)原理呀检眯,一臉懵逼的樣子骑晶,感覺跟那個面試的人相差甚遠(yuǎn)匾浪,現(xiàn)在有空來系統(tǒng)整理一下我自己對NSDictionary內(nèi)部實(shí)現(xiàn)原理的理解,真的理解了對你只有好處沒有壞處匈睁,永遠(yuǎn)不要說我會用就完了监透,那只是初級開發(fā)工程師的要求不是嗎?廢話不多說航唆,希望各位引起重視胀蛮。

一言以蔽之:在OC中NSDictionary是使用hash表來實(shí)現(xiàn)key和value的映射和存儲的。

那么問題來了什么是hash表呢糯钙?

哈希表(hash表):又叫做散列表醇滥,是根據(jù)關(guān)鍵碼值(key value)而直接訪問的數(shù)據(jù)結(jié)構(gòu)。也就是說它通過關(guān)鍵碼值映射到表中一個位置來訪問記錄超营,以加快查找的速度鸳玩。這個映射叫做函數(shù),存放記錄的數(shù)組叫做哈希表演闭。

讀到此處我們得到一個關(guān)鍵信息:所謂哈希表就是一個數(shù)組不跟,數(shù)組中每一個元素稱為一個箱子(bin),箱子中存放的是鍵值對米碰∥迅铮看一個示意圖就一目了然了:

hash表示意圖.png
hash表存儲過程簡單介紹:
  1. 根據(jù)key值計算出它的hash值h;
  2. 假設(shè)箱子的個數(shù)是n吕座,那么鍵值對應(yīng)該放在第(h%n)個箱子中虐译。
  3. 如果該箱子中已經(jīng)有了鍵值對,就是用開放尋址法或者拉鏈法解決沖突吴趴。使用拉鏈法解決哈希沖突時漆诽,每個箱子其實(shí)是一個鏈表,屬于同一個箱子的所有鍵值對都會排列在鏈表中锣枝。

依此我們得出結(jié)論:OC中的字典其實(shí)是一個數(shù)組厢拭,數(shù)組中每一個元素同樣為一個鏈表實(shí)現(xiàn)的數(shù)組,也就是數(shù)組中套數(shù)組撇叁。

那么對應(yīng)在oc中字典是如何進(jìn)行存儲的呢供鸠?

在oc中每一個對象創(chuàng)建時,都默認(rèn)生成一個hashCode,也就是經(jīng)過hash算法生成的一串?dāng)?shù)字陨闹,當(dāng)利用key去取字典中的value時楞捂,若是使用遍歷或者二分查找等方法薄坏,效率相對較低,于是出現(xiàn)了根據(jù)每一個key生成的hashCode將鍵值對放到hasCode對應(yīng)的數(shù)組中的指定位置寨闹,這樣當(dāng)用key去取值時胶坠,便不必遍歷去獲取,既可以根據(jù)hashCode直接取出鼻忠。因為hashCode的值過大涵但,或許經(jīng)過取余獲取一個較小的數(shù)字杈绸,假如是對999進(jìn)行取余運(yùn)算帖蔓,那么得到的結(jié)果始終處于0-999之間。但是瞳脓,這樣做的弊端在于取余所得到的值塑娇,可能是相同的,這樣可能導(dǎo)致完全不相干的鍵值對被新的鍵值對(取余后值key相等)所覆蓋劫侧,于是出現(xiàn)了數(shù)組中套鏈表實(shí)現(xiàn)的數(shù)組埋酬。這樣,key值取余得到值相等的鍵值對烧栋,都將保存在同一個鏈表數(shù)組中写妥,當(dāng)查找key對應(yīng)的值時,首先獲取到該鏈表數(shù)組审姓,然后遍歷數(shù)組珍特,取正確的key所對應(yīng)的值即可。

至此NSDictionary的底層原理算是基本上講透徹了魔吐,希望對看到者有一定的啟示作用扎筒,那么筆者就心滿意足了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末酬姆,一起剝皮案震驚了整個濱河市嗜桌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌辞色,老刑警劉巖骨宠,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異相满,居然都是意外死亡诱篷,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門雳灵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來棕所,“玉大人,你說我怎么就攤上這事悯辙×帐。” “怎么了迎吵?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長针贬。 經(jīng)常有香客問我击费,道長,這世上最難降的妖魔是什么桦他? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任蔫巩,我火速辦了婚禮,結(jié)果婚禮上快压,老公的妹妹穿的比我還像新娘圆仔。我一直安慰自己,他們只是感情好蔫劣,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布坪郭。 她就那樣靜靜地躺著,像睡著了一般脉幢。 火紅的嫁衣襯著肌膚如雪歪沃。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天嫌松,我揣著相機(jī)與錄音沪曙,去河邊找鬼。 笑死萎羔,一個胖子當(dāng)著我的面吹牛液走,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播外驱,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼育灸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了昵宇?” 一聲冷哼從身側(cè)響起磅崭,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瓦哎,沒想到半個月后砸喻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蒋譬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年割岛,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片犯助。...
    茶點(diǎn)故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡癣漆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出剂买,到底是詐尸還是另有隱情惠爽,我是刑警寧澤癌蓖,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站婚肆,受9級特大地震影響租副,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜较性,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一用僧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧赞咙,春花似錦责循、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽着逐。三九已至崔赌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間耸别,已是汗流浹背健芭。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留秀姐,地道東北人慈迈。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像省有,于是被迫代替她去往敵國和親痒留。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評論 2 355