計算一個數(shù)與2的n次方取模

HashMap的數(shù)據(jù)是存儲在鏈表數(shù)組里面的。在對HashMap進行插入/刪除等操作時疗隶,都需要根據(jù)K-V對的鍵值定位到他應該保存在數(shù)組的哪個下標中。
而這個通過鍵值求取下標的操作就叫做哈希斑鼻。
HashMap的數(shù)組是有長度的,Java中規(guī)定這個長度只能是2的倍數(shù)蜀备,初始值為16史汗。
求哈希簡單的做法是先求取出鍵值的hashcode,然后在將hashcode得到的int值對數(shù)組長度進行取模停撞。為了考慮性能,Java總采用按位與操作實現(xiàn)取模操作艰猬。

先看代碼:

static int indexFor(int h, int length) {
   return h & (length-1);
}

按理說定位HashMap的角標應該是根據(jù)h%length來計算埋市,為啥這里用的是h & (length-1)。原來作者是考慮到
位運算(&)效率要比代替取模運算(%)高很多道宅,主要原因是位運算直接對內(nèi)存數(shù)據(jù)進行操作,不需要轉(zhuǎn)成十進制樱报,因此處理速度非撑⒌保快。

那么,為什么可以使用位運算(&)來實現(xiàn)取模運算(%)呢嚷量?這實現(xiàn)的原理如下:

X % 2^n = X & (2^n - 1)

2n表示2的n次方逆趣,也就是說,一個數(shù)對2n取模 == 一個數(shù)和(2^n - 1)做按位與運算 汗贫。

假設n為3,則2^3 = 8部蛇,表示成2進制就是1000咐蝇。2^3 -1 = 7 涯鲁,即0111有序。

此時X & (2^3 - 1) 就相當于取X的2進制的最后三位數(shù)。

從2進制角度來看警绩,X / 8相當于 X >> 3盅称,即把X右移3位,此時得到了X / 8的商缩膝,而被移掉的部分(后三位),則是X % 8将饺,也就是余數(shù)痛黎。

上面的解釋不知道你有沒有看懂,沒看懂的話其實也沒關(guān)系湖饱,你只需要記住這個技巧就可以了。或者你可以找?guī)讉€例子試一下。

6 % 8 = 6 彪置,6 & 7 = 6

10 % 8 = 2 蝇恶,10 & 7 = 2

image

所以,return h & (length-1);只要保證length的長度是2^n的話潘懊,就可以實現(xiàn)取模運算了贿衍。而HashMap中的length也確實是2的倍數(shù),初始值是16贸辈,之后每次擴充為原來的2倍。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末奢啥,一起剝皮案震驚了整個濱河市嘴拢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌席吴,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件姑曙,死亡現(xiàn)場離奇詭異迈倍,居然都是意外死亡,警方通過查閱死者的電腦和手機宴合,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門迹鹅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人阀蒂,你說我怎么就攤上這事该窗。” “怎么了酗失?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵昧绣,是天一觀的道長。 經(jīng)常有香客問我拖刃,道長贪绘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任发绢,我火速辦了婚禮垄琐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘狸窘。我一直安慰自己,他們只是感情好翻擒,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布陋气。 她就那樣靜靜地躺著,像睡著了一般巩趁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蠢古,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天别凹,我揣著相機與錄音,去河邊找鬼炉菲。 笑死坤溃,一個胖子當著我的面吹牛践啄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼伐谈,長吁一口氣:“原來是場噩夢啊……” “哼试疙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起祝旷,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎距贷,沒想到半個月后吻谋,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡阁最,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年骇两,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片配阵。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡栋操,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出矾芙,到底是詐尸還是另有隱情,我是刑警寧澤剔宪,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站感帅,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏岖是。R本人自食惡果不足惜实苞,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望黔牵。 院中可真熱鬧,春花似錦陆错、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至偷线,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間声邦,已是汗流浹背摆舟。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留恨诱,地道東北人。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓蛇受,卻偏偏與公主長得像厕鹃,于是被迫代替她去往敵國和親乍丈。 傳聞我的和親對象是個殘疾皇子把将,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容