1. 程式人生 > >HashMap如何處理自定義大小為非2的冪次方

HashMap如何處理自定義大小為非2的冪次方

先上原始碼:

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

型別資料佔32位,前4步將高16位轉換成1,最後一步將低16位轉換成1。