jdk8 hashmap tableSizeFor的理解
阿新 • • 發佈:2021-06-22
/** * Returns a power of two size for the given target capacity. */ static final int tableSizeFor(int cap) { int n = cap - 1; n |= n >>> 1; n |= n >>> 2; n |= n >>> 4; n |= n >>> 8; n |= n >>> 16;return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1; }
程式碼是這樣子,效果是為了獲取一個2的指數大小的目標大小。
這裡運算有一個重要的概念:
2進位制的數,如果任意位都為1,如:111111,這樣的數 +1後,會變成:1000000,而這個數必為2的指數。
所以,這個方法設計的時候,首先要考慮的是得到一個1111111這樣的數,然後要加1。
然後還有一點,加入cap這個傳進來的容量,就是一個2的指數呢?
這個時候,比如,傳入的是2,結果會得到4,傳入4,得到8,這樣子就造成浪費,也與使用者的意圖不符。
>>> 代表無符號右移,在正數的時候和>>是一樣的。