HashMap的容量為什麼一直是2的次冪

2021-09-26 22:42:37 字數 1510 閱讀 2514

初始容量

hashmap的初始化容量的為16,長度始終保持2的n次方,給hashmap初始化容量時如果不是2的指數次冪,它會自動變成最接近它的上面的2的指數次冪,如hashmaphm = new hashmap<>(13) ,它的容量會自動轉成16;這樣做的好處當然是為了提高效率。

hashmap是根據key的hash值決策key放入到哪個位置,具體演算法是通過[(length - 1) & hash]進行與運算進而覺得存放位置,為了保證與運算結果與hash%length運算結果一直,所以才會保證讓容量長度length為2的n次方,例如

2的4次方 = 16  然後16-1 = 15 換成二進位制 0000 1111  與隨便乙個數進行與運算,假設這個數1011 0110 最終結果都是這個數的前四位 0000 0110,進而保證了 182%16=6 換成二進位制 0000 0110 正好與16-1  & 1011 0110 結果相同。

那麼有人就會問了 為什麼不直接取模而是進行與運算呢?直接取模不更省事麼?其實這樣做有兩個好處:

載入因子(擴容因子):

通重載入因子來判斷該hashmap是否該擴容了,預設的hashmap的載入因子為0.75,也就是該陣列上的元素達到總數的0.75倍時表示該陣列該擴容了,但是擴容的倍數依舊是當前倍數的一倍。

其他集合的預設容量及載入因子:

list元素是有序的、可重複

arraylist、vector預設初始容量為10

vector:執行緒安全,但速度慢

底層資料結構是陣列結構

載入因子為1:即當 元素個數 超過 容量長度 時,進行擴容

擴容增量:原容量的 1倍

如 vector的容量為10,一次擴容後是容量為20

arraylist:執行緒不安全,查詢速度快

底層資料結構是陣列結構

擴容增量:原容量的 0.5倍+1

如 arraylist的容量為10,一次擴容後是容量為16

set(集)元素無序的、不可重複。

hashset:執行緒不安全,訪問速度快

底層實現是乙個hashmap(儲存資料),實現set介面

預設初始容量為16(為何是16,見下方對hashmap的描述)

載入因子為0.75:即當 元素個數 超過 容量長度的0.75倍 時,進行擴容

擴容增量:原容量的 1 倍

如 hashset的容量為16,一次擴容後是容量為32

map是乙個雙列集合

hashmap:預設初始容量為16

(為何是16:16是2^4,可以提高查詢效率,另外,32=16<<1       -->至於詳細的原因可另行分析,或分析源**)

載入因子為0.75:即當 元素個數 超過 容量長度的0.75倍 時,進行擴容

擴容增量:原容量的 1 倍

如 hashset的容量為16,一次擴容後是容量為32

HashMap初始容量為什麼是16

這裡不講 只講思路。要稍微懂點二進位制。hashmap的結構是陣列加鍊表,容量指的是陣列長度。元素放入陣列的哪個位置?這由算出來的hashcode 跟 1111 作與運算 得出陣列下標。hashcode具體演算法我也不知道 為什麼是1111,因為0000 1111共16個數,跟陣列下標 容量都一致。...

專案經理為什麼一直遭人煩

1 工作得正起勁,這貨突然閃入視線現來問進度 xx介面調通了沒有,xx分享功能完成了嗎?沒有完成?那什麼時候完成?老子 你懂嗎!需要你支援了嗎!上線還需要你施壓!re 專案進度還是要跟進的,這是pm的主要職責之一,但是也不是說無時無刻不分場合的去問 我寫程式的時候也很討厭被打斷,很痛苦 和程式設計師...

為什麼你的月薪一直破不了萬?

算一筆賬,在北京扣除五險一金的全部繳納專案稅前工資需要15000元,在上海扣除五險一金要到14000元,在廣州和深圳的職場人需要稅前工資在16000元才能確保月薪破萬。所以稅前的工資不夠高,月薪拿到手裡當然只有幾千塊了。如果月薪低於萬元是常態,那麼你屬於哪一種情況?工作一兩年的職場菜鳥 如果你目前工...