背景摘要:二進制是計算機專業的入門篇,01010101010101010011001011011010100101010101010101010101010100101101011001010110101011110101010101010101011。好那麼關於二進制的我們說了這麼多,再說說 邏輯"&",今天主要根據JDK1.7HashMap源碼indexFor方法來進行解析。講其的運算規則詳情與其作用。
目錄
二、HashMap源碼IndexFor方法 "&"字符的運用
一、二進制運算結構解析
大家應該都知道程序有很多進制,好的那我們今天只講老祖宗二進制運算結構步驟。
首先是計算16(偶數)的二進制。運算爲不斷除2,首先除2爲8,餘0,依次除盡。計算結果最終從下往上取值爲10000。
但一般最後爲8尾數做填充,故最終值爲00010000。
再來計算15(奇數)的二進制。
同理:(15-1)/2 = 7 餘1 。依次(n-1)/2,得出1111。填充四個0,最終值:00001111
看完這些相信你會覺得很簡單,當然也有在線的進制轉換工具。點我
那麼今天的主角“&”。爲什麼說“&”是主角?我們能通過HashMap源碼來了解他真正的作用,同時也能瞭解HashMap一個小細節知識點。由淺入深的慢慢的進入HashMap。
二、HashMap源碼IndexFor方法 "&"字符的運用
你可能以爲我只是要說“&”,其實我還要扯上:
首先說說IndexFor方法在HashMap中主要是幹嘛的:根據元素的HashCode來計算元素在HashMap集合(數組+鏈表)中對應鏈表的下標。那麼既然是計算,HashMap中,存取都是用到了該方法的。且該方法決定了HashMap在put存值時存在哪個鏈表中。
當然關於HashMap的知識不瞭解也沒關係。來分析分析“&”計算。
“&” 又稱 與運算 如果兩者都是爲1,那麼結果爲1,否則就是0。
1&0=0;0&1=0;1&1=1;0&0=0;
那麼再說說HashMap中的index運算。首先HashMap的初始容量爲16。那麼上文我們得知計算結果值爲00010000;我們現在假設某元素的HashCode爲103;對16進行計算結果。
static int indexFor(int h, int length) {
return h & (length-1);
}
通過工具計算我們得知103的編碼爲:01100111
再將兩者根據計算公式進行對比:
結果值很明顯爲:0.那麼我們發現偶數的對比爲0。所以計算的索引爲0。其次,104/105皆是0
那麼我們發現,“&”16(偶數)的情況都是0。從而導致索引衝突碰撞那麼就極大的增加了HashMap中存取運算的速度。那麼在HashMap運算“&”時做了 (length-1)。採用16-1=15(單數)從而結果就不會那麼容易一致。
最終結果對比如圖:
總結:
二進制計算即除2到盡頭止。JDK1.7中HashMap源碼採用IndexFor方法進行邏輯與“&”的運算來進行索引位置的計算。同時通過 length-1來優化計算公式,避免索引出現高重複碰撞。