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 當然你也可以指定下標的起始位置與終止位置,比如...