HaspMap底層實現原理

2021-09-08 08:50:51 字數 1318 閱讀 1283

1.hashmap的原理,是如何實現的?執行緒安全問題? hashmap如何實現動態擴容?

(1)實現原理

hashmap是基於雜湊法(又稱雜湊法hashing)的原理,使用put(key,value)儲存物件到hashmap中,使用get(key)從hashmap中獲取物件。當給put()方法傳遞鍵和值時,我們先對鍵呼叫hashcode()方法,根據返回的hashcode用於找到bucket(桶)位置來儲存entry物件。」hashmap是在bucket中儲存鍵物件和值物件,作為map.entry。並不是僅僅只在bucket中儲存值。

(2)hashmap並不是執行緒安全的,但是 concurrenthashmap、hashtable是執行緒安全的。

2.hashmap和hashtable區別

(1)都是map的實現類、都是鍵值對集合

(2)裡邊的元素都是無序的,跟新增順序無關。

(3)hashmap允許多個null值和乙個null鍵,hashtable不允許有null值和null鍵

(4)hashtable是執行緒安全的,hashmap不是執行緒安全的

3.hashmap存在大量雜湊衝突該怎麼處理?

(1)hash衝突:如果鍵值的hashcode相同,它們的儲存位置就相同。如果key不同,那麼就會產生hash衝突。這時hashmap的單個bucket裡儲存的不是乙個 entry,而是乙個 entry 鏈。

如果存在相同的hashcode和相同的key的元素,那麼新值覆蓋原來的舊值,並返回舊值。  

(2)如果要查詢資料,只能按順序遍歷每個 entry鏈

4.偽造hash衝突現象——形成單鏈表

(1)因為hashmap的初始大小16,但是我在hashmap裡面放了超過16個元素,並且我遮蔽了它的resize()方法,不讓它去擴容。這時hashmap的底層陣列entry   table結構如下: 

5.hashmap大小及擴容(基於內部實現機制)

(1)閾值threshold=default_load_factor因子*default_initial_capacity大小(16)

(2)通過rehash進行擴容,呼叫resize方法。

(3)負載因子預設0.75,減小負載因子,增加hash表所佔的記憶體空間,提高資料的查詢效能

6.如何解決雜湊值的衝突問題?

(1)鍊錶法:將相同hash值物件組成乙個鍊錶放在hash值對應的位置;

KVO底層實現原理

kvo是實現cocoa bindings的基礎,它提供了一種方法,當某個屬性改變時,相對的objects會被通知到。在其他語言中,這種觀察者模式通常需要單獨實現,而在objective c中,通常無須增加額外 即可使用,這是怎麼實現的呢?其實就是通過oc強大的執行時 runtime 實現的。當你第一...

NSDictionary底層實現原理

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

hashmap底層實現原理

每次初始化hashmap都會構造乙個table陣列,而table陣列的元素為entry節點。static class entryimplements map.entryhashmap也可以說是乙個陣列鍊錶,hashmap裡面有乙個非常重要的內部靜態類 entry,這個entry非常重要,它裡面包含了...