HashMap為什麼重新計算hash值

2021-08-19 06:31:52 字數 825 閱讀 6738

hashmap是乙個儲存key-value鍵值對的集合,每個鍵值對稱為乙個entity,這些entity分散儲存到乙個陣列中,這個陣列就是hashmap的主幹,我們通過乙個hash函式得到一列二進位制數去與(陣列長度-1)去&,得到index陣列下標位置,然後put陣列中去,當我們長度改變,肯定要重新計算hash值

2.1:hashmap的初始長度為多少

主幹的初始化長度為16(以後擴充套件必須是2的冪)之所以選擇16的原因

1: 我們在計算index的時候,並不是index=hashcode("key")%length這樣計算的,這樣效率太低,在hashmap中我們一般採用位運算,  index=hashcode("key")&(length-1)也就是(1111)這樣比較hash函式的最後四位,這樣更好的均勻分布,如果我們用10,那麼(1001) 這樣就會導致,某些結過出現的頻率很大,有的幾乎不出現(0111決定不出現)

2.2:hashmap是乙個什麼樣的結構,怎樣解決衝突的

陣列+鍊錶方式解決衝突,採用頭插法解決衝突(之所以不採用尾叉法的原因是hashmap發明者認為後插入的entity被查詢的肯呢過下較大)

2.3:hashmap再高併發的情況下有什麼問題

hashmap非執行緒安全的,在多執行緒的情況下,hashmap的rehash操作會形成鍊錶環,我們在併發插入元素的時候,有可能出現帶環鍊錶,讓下一次讀操作出現死迴圈

hashmap.size>=capacity*loadfactor

capacity: hashmap當前長度

loadfactor:負載因子,預設值是0.75f

hashmap.size:鍵-值對映的數量,也就是我們entity實體的數量

HashMap為什麼樹化

在jdk1.8中,hashmap做了一些改變 jdk1.7中,發生雜湊碰撞時,將鍵值對新增到鍊錶頭部,jdk1.8是將鍵值對新增到鍊錶尾部。jdk1.8中,如果鍊錶的長度超過8,將會將鍊錶轉化為紅黑樹。容量的初始化 jdk1.7的hashmap在構造時會對容量進行初始化,而jdk1.8是在首次向ha...

hashmap為什麼不安全

第一點多執行緒同時put的時候 在某一時刻同時操作hashmap並執行put操作,而有大於兩個key的hash值相同,如圖中a1 a2,這個時候需要解決碰撞衝突,而解決衝突的辦法上面已經說過,對於鍊錶的結構在這裡不再贅述,暫且不討論是從鍊錶頭部插入還是從尾部初入,這個時候兩個執行緒如果恰好都取到了對...

為什麼HashMap不是執行緒安全的

序 最近因為專案的需求,經常會面試一些新人,也就會問他們一些基本的問題,例如,hashmap和hashtable的區別是什麼,一般人想到的就是hashmap不是執行緒安全,這點我想幾乎來面試的人都知道,但是再深入問下為什麼hashmap不是執行緒安全的,幾乎沒有人答上來,當然了,我也不會因為你回答不...