hashmap如何選下標

2021-10-01 10:53:21 字數 838 閱讀 3047

源**:

//計算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位移動到低16位

^表示異或操作,相同為0,不同為1,為1和0的概率都為1/2

所以意思就是把32位hash值得高16位與低16位進行異或操作,返回處理過的32位hash值

//根據hash計算長度為n的陣列的下標

if ((p = tab[i = (n - 1) & hash]) == null)

tab[i] = newnode(hash, key, value, null);

解釋:n是陣列長度,n是2的次冪,二進位制是10000...的形式

則n-1為1111的形式,任何數與之相與都會小於等於n-1

//1左移動四位得到16

static final int default_initial_capacity = 1 << 4; // aka 16

解釋:1左移四位二進位制則是10000,轉十進位制,則是2^4次方=16

//將16作為初始陣列大小

newcap = default_initial_capacity;

問題:為什麼陣列長度為2^n次方

解答:因為要從2^n-1中選擇陣列下標,2^n-1的二進位制形式為n個1組成,當hash值與之相與,得到的數會小於等於2^n-1且算出相同陣列下標概率低

HashMap 裡陣列下標如何確定?

hashmap 是典型的 key 對應 value 的介面 裡面是陣列加鍊表,當 key 的hash值衝突時 用鏈位址法解決衝突 在同乙個相同下標的table中用鍊錶的形式連線起來 在這裡就可以產生問題 key的 hash 值是怎麼來的?這樣的hash 方式有什麼好處?答 在jdk1.7 中 sta...

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

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

Python的下標如何獲取

下標 又稱為索引,其實在程式裡面對應的就是乙個數字。學習下標的目標 根據下標能夠獲取指定位置的資料,比如 下標可以結合字串,列表,元組使用。下標在python裡面有正數下標和負數下標 my str hello 根據下標獲取字串中的某個資料 result my str 0 print result 列...