中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java源碼解析HashMap的tableSizeFor函數

發布時間:2020-08-26 11:16:40 來源:腳本之家 閱讀:208 作者:李燦輝 欄目:編程語言

aka,HashMap的容量大小必須為2的指數,即16,32,64,128這樣的值。那么,在構造函數中,如果調用者指定了HashMap的初始大小不是2的指數,那么,HashMap的tableSizeFor函數,會計算一個大于或等于給定參數的2的指數的值。先來看一下tableSizeFor函數的源碼,如下

  /**
   * 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;
  }

這里采用的計算方法不太常見。先是對cap-1,然后一直進行右移操作,最后根據n和MAXIMUM_CAPCITY的大小關系,返回一個值。這究竟是如何實現找到一個大于或等于cap的2的指數的值呢?

首先需要解釋一下>>>符號。>>>是無符號右移操作,即,右移后,高位補0. 例如二進制的11000101,>>>1后,得到01100010,即不關心符號位,右移后,高位直接補充0. 

還有一個符號是|=,例如n |= n>>>1,這個其實可以翻譯為n = n | n>>>1,| 是位或操作,即兩個數字按位進行或操作,即,某一位上,只有一個數字的該位為1,該位的結果即為1.

說清楚了兩個符號的含義,下面我們開始解釋算法的過程。

函數一開始,把cap -1 賦值給n。這里我們先按住不說,稍后回頭解釋。接下來就是對n的四次變換。舉個例,對于

01010000

這個值來說,n>>>1即可得到

00101000

兩個數字位或后,得到

01111000

可以這么來看這個事情,最開始的n,總有它的最高位為1. 右移1位后,與n進行位或操作,則結果的最高位和次高位都為1了,也就是得到了2個1,而且是高位的2位都為1了。

那么這時再對n進行n>>>2,再和n進行位或操作,即可得到4個1. 依此類推,n |= n>>>4,即可得到8個1。然后n |= n>>>8,即可得到16個1。然后 n |= n>>>16,即可得到32個1. 當然,后面幾步得到多少個1,得需要n的初始值足夠大才可以。否則,n右移后可能就位0了,那么在進行位或操作,也只是上一步的值而已。

通過上面的分析,可以知道,進行完n的四次右移然后位或操作后,得到的其實是n的所有為都為1的一個值。那么最后,返回的時候,取的n + 1,那么即可得到一個比n大的2的指數的值。

那么回過頭來看看第一步 n = cap -1就明白了,這里是為了處理當cap本身即是2的指數時的情況。

因為計算機進行移位和位或操作十分迅速,所以,這個函數的執行效率其實很高。tableSizeFor函數就是這樣快速找到了一個大于等于cap的2的指數的值。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對億速云的支持。如果你想了解更多相關內容請查看下面相關鏈接

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

苏州市| 绵竹市| 谢通门县| 集安市| 凤山市| 乡城县| 石林| 秀山| 盘山县| 新余市| 双桥区| 离岛区| 莒南县| 阳西县| 伽师县| 文成县| 西贡区| 新泰市| 遂溪县| 中牟县| 济源市| 杭州市| 锡林郭勒盟| 武宁县| 德格县| 德保县| 清镇市| 云和县| 新安县| 宣化县| 芜湖县| 云林县| 太湖县| 庆城县| 临澧县| 天长市| 定结县| 民县| 萍乡市| 铁岭市| 河南省|