HashMap如何處理自定義大小為非2的冪次方
阿新 • • 發佈:2018-12-21
先上原始碼:
static final int tableSizeFor(int i) {//i為自定義容器的大小
int j = i - 1;
j |= j >>> 1;
j |= j >>> 2;
j |= j >>> 4;
j |= j >>> 8;
j |= j >>> 16;
return j >= 0 ? j < MAXIMUM_CAPACITY? j + 1 : MAXIMUM_CAPACITY: 1;
}
這段程式碼的作用是將一個非負整數(自定義大小)轉換成第一個大於等於它本身的2的冪次方
例如,設定大小為9,則經過計算得到16。 基本思路:二進位制下低位全部轉換成1,再加一,大小為9的時候,00001001,要得到00001111,再加一得到00010000,即16。
具體計算過程如下:
第一步:j |= j >>> 1;
00001000 >>> 1 ==> 00000100
00001000 | 00000100 ==> 00001100
第二步:j |= j >>> 2;
00001100 >>> 2 ==> 00000011
00001100 | 00000011 ==> 00001111
第三步、第四步同樣。
原理: 利用非負整數第一位二進位制為1的特點,結合左移和或運算,將原資料低位轉換成1。
細節:
1、演算法開頭需要將原始大小減一,目的是考慮原始大小為2的冪次方時,得到結果還是其本身。
2、返回值:必須為非負整數,否則返回1,若超過最大值,則返回最大值(int能儲存的最大值)
3、為什麼左移16位就計算結束了?因為int