HashMap的tableSizeFor方法解析

2021-10-21 14:14:48 字數 1659 閱讀 1482

返回大於或等於引數的最近的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...