HashMap 裡陣列下標如何確定?

2021-08-10 17:23:45 字數 898 閱讀 1670

hashmap

是典型的

key

對應 value

的介面

,裡面是陣列加鍊表, 當

key

的hash值衝突時 用鏈位址法解決衝突

,在同乙個相同下標的table中用鍊錶的形式連線起來

在這裡就可以產生問題:

key的

hash

值是怎麼來的?

這樣的hash

方式有什麼好處?

答: 

在jdk1.7 中

static

intindexfor(

inth, 

intlength)   

要明確的是目的是為了使table裡的資料分布的更均勻

與運算是轉化為二進位制數 再相與( 都為1 則輸出1 見0為0)

比如 128& 129

128 二進位制:10000000

129 二進位制:10000001

結果為10000000   128

可以看出與偶數相與時,一定會是偶數

hashmap的初始大小和擴容都是以2的次方來進行的,換句話說length-1換成二進位制永遠是全部為1,比如容量為16,則length-1為1111,所以相與的數可能是偶數或者奇數

,這樣hash後的值在table中盡量的分散,前面就有提到

hash的目的就是為了使分布更均勻 減少衝突

而在jdk1.8中

static final int hash(object key)

因為對自己改造過的雜湊大量衝突時的紅黑樹有信心,所以簡單一點,只是把高16異或下來(異或的操作是相同為0 不同為1) 

hashmap如何選下標

源 計算32位hash值 static final int hash object key int h return key null 0 h key.hashcode h 16 解釋 key.hashcode 得到32位hash整形值 h 16表示邏輯右移16位,左邊補16位0,相當於把高16位移...

HashMap中如何計算陣列索引下標?

對於key的hashcode做hash操作,無符號右移16位然後做異或運算。還有平方取中法,偽隨機數法和取餘數法。這三種效率都比較低。而無符號右移16位異或運算效率是最高的。集合中的初始化容量 必須是二的n次冪 預設的初始容量是16 1 4相當於1 2的4次方 1 16 static final i...

Julia 如何優雅的改變陣列的下標

樓主原來一直用fortran語言寫 最近想學學julia語言。在陣列下標這塊感覺和fortran有點不一樣。特此記錄 在fortran中,比如定義如下陣列 real kind 8 a 10 表示有10個元素,預設下標從1開始,即a 1 a 2 a 10 當然你也可以指定下標的起始位置與終止位置,比如...