NSDictionary底層實現原理

2022-06-14 15:39:09 字數 1036 閱讀 7516

一言以蔽之:在oc中nsdictionary是使用hash表來實現key和value的對映和儲存的。

那麼問題來了什麼是hash表呢?

雜湊表(hash表): 又叫做雜湊表,是根據關鍵碼值(key value)而直接訪問的 資料結構 。也就是說它通過關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映叫做 函式 ,存放記錄的 陣列 叫做 雜湊表 。

讀到此處我們得到乙個關鍵資訊:所謂 雜湊表就是乙個陣列 ,陣列中每乙個元素稱為乙個箱子(bin),箱子中存放的是鍵值對。看乙個示意圖就一目了然了:

hash表儲存過程簡單介紹:

根據key值計算出它的hash值h;

假設箱子的個數是n,那麼鍵值對應該放在第(h%n)個箱子中。

如果該箱子中已經有了鍵值對,就是用開放定址法或者拉鍊法解決衝突。使用拉鍊法解決雜湊衝突時,每個箱子其實是乙個鍊錶,屬於同乙個箱子的所有鍵值對都會排列在鍊錶中。

依此我們得出結論:oc中的字典其實是乙個陣列,陣列中每乙個元素同樣為乙個鍊錶實現的陣列,也就是陣列中套陣列。

那麼對應在oc中字典是如何進行儲存的呢?

在oc中每乙個物件建立時,都預設生成乙個hashcode,也就是經過hash演算法生成的一串數字,當利用key去取字典中的value時,若是使用遍歷或者二分查詢等方法,效率相對較低,於是出現了根據每乙個key生成的hashcode將鍵值對放到hascode對應的陣列中的指定位置,這樣當用key去取值時,便不必遍歷去獲取,既可以根據hashcode直接取出。因為hashcode的值過大,或許經過取餘獲取乙個較小的數字,假如是對999進行取餘運算,那麼得到的結果始終處於0-999之間。但是,這樣做的弊端在於取餘所得到的值,可能是相同的,這樣可能導致完全不相干的鍵值對被新的鍵值對(取餘後值key相等)所覆蓋,於是出現了陣列中套鍊錶實現的陣列。這樣,key值取餘得到值相等的鍵值對,都將儲存在同乙個鍊錶陣列中,當查詢key對應的值時,首先獲取到該鍊錶陣列,然後遍歷陣列,取正確的key所對應的值即可。

**:

NSDictionary底層實現原理

那麼問題來了什麼是hash表呢?雜湊表 hash表 又叫做雜湊表,是根據關鍵碼值 key value 而直接訪問的 資料結構 也就是說它通過關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映叫做 函式 存放記錄的 陣列 叫做 雜湊表 讀到此處我們得到乙個關鍵資訊 所謂 雜湊表就是乙個陣...

ConcurrentHashMap底層實現

concurrenthashmap融合了hashtable和hashmap二者的優勢 hashtable是做了同步的,hashmap沒有同步,所以hashmap在單執行緒情況下效率高,hashtable在多執行緒情況下,同步操作能保證程式執行的正確性 但是hashtable每次同步執行都要鎖住整個結...

簡單常用 NSDictionary

新增我們的測試 nsdictionary dictionary nsdictionary dictionarywithobjectsandkeys lucy name 15810463139 number nil 得到詞典的數量 nsinteger mcount dictionary count n...