返回大於或等於引數的最近的2的整數次冪的數tablesizefor(5) => 8
tablesizefor(8) => 8
// 設cap=8; n=7
int n = cap -1;
// 0000 0000 0000 0000 0000 0000 0000 0111
// 0000 0000 0000 0000 0000 0000 0000 0011
n |= n >>>1;
// 0000 0000 0000 0000 0000 0000 0000 0111
// 0000 0000 0000 0000 0000 0000 0000 0001
n |= n >>>2;
n |= n >>>4;
n |= n >>>8;
n |= n >>>16;
// 0000 0000 0000 0000 0000 0000 0000 0111
// 負數返回1, 超出最大值返回最大值
return
(n <0)
?1:(n >= maximum_capacity)
? maximum_capacity : n +1;
// 設cap=13; n=12
int n = cap -1;
// 0000 0000 0000 0000 0000 0000 0000 1101
// 0000 0000 0000 0000 0000 0000 0000 0110
n |= n >>>1;
// 0000 0000 0000 0000 0000 0000 0000 1111
// 0000 0000 0000 0000 0000 0000 0000 0011
n |= n >>>2;
n |= n >>>4;
n |= n >>>8;
n |= n >>>16;
// 0000 0000 0000 0000 0000 0000 0000 1111
// 負數返回1, 超出最大值返回最大值
return
(n <0)
?1:(n >= maximum_capacity)
? maximum_capacity : n +
1;
已知 2的整數次冪表示在二進位制為 最高位 (值: 1) 後面幾個0
已知 任何數表示在二進位制最高位都是1
方法邏輯 將傳入引數所表示的二進位制. 最高位1 後面的所有位的值變為1. 再將結果+1.
// 這是為了避免傳入引數正好為 2的整數次冪 時. 計算的結果過大. -1 後計算的結果會是他本身
int n = cap -
1// 最高位右移1位然後與原值 進行 或 運算. 得到的結果 最高的兩位值變為1(不論原值是什麼)
// 0100 **
// 0010 **
// 0110 **
n|= n>>>
1// 現在可以確定最高2位的值均為1 . 所以右移2位然後 或運算
n|= n>>>
2// 以此類推
n|= n>>>
4n|= n>>>
8n|= n>>>
16
HashMap以及跟HashMap相關的內容
hashmap相信大家都用過,是以這樣的格式儲存的。其實內部真正用於儲存的是entry的陣列table 桶 下面就是源 了已經標註出來了 emprty table是個空表,用於是初始化時使用的。default load factor是負載因子,default initial capacity是初始化...
HashMap原始碼系列 HashMap的屬性
public class hashmap extends abstractmap implements map,cloneable,serializable容載因子 容載因子越大,table陣列中儲存的資料越密集,碰撞的可能性就越大。容載因子越小,儲存越稀疏,碰撞的可能性就越小,不過浪費儲存空間。轉...
hashmap巢狀hashmap迴圈生成二維陣列
hashmap巢狀hashmap如何把資料合成乙個二維陣列 思路是定義乙個二維陣列的行和列 行和列的大小是根據兩個兩個陣列來的,兩個陣列分別是第一行和第一列 通過迴圈這兩個二維陣列,取二維陣列的值去判斷hashmap裡是否有這個型別的值,然後對應二維陣列的行和列進行一一插入。然後 map的值,110...