最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java源碼解析HashMap的tableSizeFor函數

 更新時間:2019年01月09日 09:41:17   作者:李燦輝  
今天小編就為大家分享一篇關于Java源碼解析HashMap的tableSizeFor函數,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧

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的指數時的情況。

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

總結

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

相關文章

  • java實現去除ArrayList重復字符串

    java實現去除ArrayList重復字符串

    本文主要介紹了java實現去除ArrayList重復字符串,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-09-09
  • 如何使用Jackson和JSON Pointer查詢解析任何JSON節(jié)點

    如何使用Jackson和JSON Pointer查詢解析任何JSON節(jié)點

    本文介紹了JSON Pointer是字符串表達式,可以非常方便解析復雜JSON節(jié)點值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • JAVA中使用JSON進行數據傳遞示例

    JAVA中使用JSON進行數據傳遞示例

    本篇文章主要介紹了JAVA中使用JSON進行數據傳遞示例,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • JAVA--HashMap熱門面試題

    JAVA--HashMap熱門面試題

    這篇文章主要介紹了JAVA關于HashMap容易被提問的面試題,文中題目提問頻率高,相信對你的面試有一定幫助,想要入職JAVA的朋友可以了解下
    2020-06-06
  • mybatis-plus的sql加載順序源碼解析

    mybatis-plus的sql加載順序源碼解析

    這篇文章主要為大家介紹了mybatis-plus的sql加載順序源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • Idea2019創(chuàng)建Springboot Web項目的方法步驟

    Idea2019創(chuàng)建Springboot Web項目的方法步驟

    這篇文章主要介紹了Idea2019創(chuàng)建Springboot Web項目的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10
  • Java將Word文件轉為OFD文件

    Java將Word文件轉為OFD文件

    大家好,本篇文章主要講的是Java將Word文件轉為OFD文件,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • java對于目錄下文件的單詞查找操作代碼實現

    java對于目錄下文件的單詞查找操作代碼實現

    這篇文章主要介紹了java對于目錄下文件的單詞查找操作代碼實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • 為什么程序中突然多了 200 個 Dubbo-thread 線程的說明

    為什么程序中突然多了 200 個 Dubbo-thread 線程的說明

    這篇文章主要介紹了為什么程序中突然多了 200 個 Dubbo-thread 線程的說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • SpringBoot日志框架之Log4j2快速入門與參數詳解

    SpringBoot日志框架之Log4j2快速入門與參數詳解

    本文介紹了SpringBoot日志框架log4j2的基本使用和配置方法,包括將日志輸出到控制臺、文件、Elasticsearch和Kafka,多個輸出目的地的配置,異步日志記錄器的使用以及l(fā)og4j2.xml配置文件的詳細語法和參數含義,需要的朋友可以參考下
    2023-05-05

最新評論

横山县| 东源县| 工布江达县| 嘉荫县| 梅河口市| 苍溪县| 化德县| 江阴市| 集安市| 仁化县| 郴州市| 奈曼旗| 壤塘县| 丹东市| 平昌县| 宝清县| 龙泉市| 宽甸| 东山县| 兴和县| 钟祥市| 道真| 宽甸| 江陵县| 疏附县| 乌拉特中旗| 阜平县| 中山市| 建始县| 凤台县| 柳江县| 定州市| 淮安市| 托里县| 乡宁县| 台前县| 吉隆县| 成安县| 桐城市| 苍山县| 临夏县|