源**:
//計算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 列...