二進制運算與Java邏輯&

背景摘要:二進制是計算機專業的入門篇,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來優化計算公式,避免索引出現高重複碰撞。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章