欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java源碼解析HashMap的tableSizeFor函數(shù)

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

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

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

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

首先需要解釋一下>>>符號(hào)。>>>是無符號(hào)右移操作,即,右移后,高位補(bǔ)0. 例如二進(jìn)制的11000101,>>>1后,得到01100010,即不關(guān)心符號(hào)位,右移后,高位直接補(bǔ)充0. 

還有一個(gè)符號(hào)是|=,例如n |= n>>>1,這個(gè)其實(shí)可以翻譯為n = n | n>>>1,| 是位或操作,即兩個(gè)數(shù)字按位進(jìn)行或操作,即,某一位上,只有一個(gè)數(shù)字的該位為1,該位的結(jié)果即為1.

說清楚了兩個(gè)符號(hào)的含義,下面我們開始解釋算法的過程。

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

01010000

這個(gè)值來說,n>>>1即可得到

00101000

兩個(gè)數(shù)字位或后,得到

01111000

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

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

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

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

因?yàn)橛?jì)算機(jī)進(jìn)行移位和位或操作十分迅速,所以,這個(gè)函數(shù)的執(zhí)行效率其實(shí)很高。tableSizeFor函數(shù)就是這樣快速找到了一個(gè)大于等于cap的2的指數(shù)的值。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接

相關(guān)文章

  • 淺析java并發(fā)中的Synchronized關(guān)鍵詞

    淺析java并發(fā)中的Synchronized關(guān)鍵詞

    這篇文章主要介紹了java并發(fā)中的Synchronized關(guān)鍵詞,本文通過思路代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Java 使用openoffice進(jìn)行word轉(zhuǎn)換為pdf的方法步驟

    Java 使用openoffice進(jìn)行word轉(zhuǎn)換為pdf的方法步驟

    這篇文章主要介紹了Java 使用openoffice進(jìn)行word轉(zhuǎn)換為pdf的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 微信支付java版本之Native付款

    微信支付java版本之Native付款

    這篇文章主要為大家詳細(xì)介紹了微信支付java版本之Native付款,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Springboot整合Shiro實(shí)現(xiàn)登錄與權(quán)限校驗(yàn)詳細(xì)解讀

    Springboot整合Shiro實(shí)現(xiàn)登錄與權(quán)限校驗(yàn)詳細(xì)解讀

    本文給大家介紹Springboot整合Shiro的基本使用,Apache?Shiro是Java的一個(gè)安全框架,Shiro本身無法知道所持有令牌的用戶是否合法,我們將整合Shiro實(shí)現(xiàn)登錄與權(quán)限的驗(yàn)證
    2022-04-04
  • 關(guān)于弗洛伊德算法求最短路徑詳解

    關(guān)于弗洛伊德算法求最短路徑詳解

    這篇文章主要介紹了關(guān)于弗洛伊德算法求最短路徑詳解,弗洛伊德算法VS迪杰斯特拉算法:迪杰斯特拉算法通過選定的被訪問頂點(diǎn),求出從出發(fā)訪問頂點(diǎn)到其他項(xiàng)點(diǎn)的最短路徑:弗洛伊德算法中每-個(gè)頂點(diǎn)都是出發(fā)訪問點(diǎn),需要的朋友可以參考下
    2023-07-07
  • java 內(nèi)部類的詳解及實(shí)例

    java 內(nèi)部類的詳解及實(shí)例

    這篇文章主要介紹了 java 內(nèi)部類的詳解及實(shí)例的相關(guān)資料,這里提供了兩種內(nèi)部類的實(shí)現(xiàn)方法,并給出實(shí)例,需要的朋友可以參考下
    2017-08-08
  • Redis有效時(shí)間設(shè)置以及時(shí)間過期處理操作

    Redis有效時(shí)間設(shè)置以及時(shí)間過期處理操作

    這篇文章主要介紹了Redis有效時(shí)間設(shè)置以及時(shí)間過期處理操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • 詳解如何將JAR包發(fā)布到Maven中央倉庫

    詳解如何將JAR包發(fā)布到Maven中央倉庫

    這篇文章主要介紹了詳解如何將JAR包發(fā)布到Maven中央倉庫,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-01-01
  • Spring Boot整合Spring Security的示例代碼

    Spring Boot整合Spring Security的示例代碼

    這篇文章主要介紹了Spring Boot整合Spring Security的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-04-04
  • 簡(jiǎn)單的理解java集合中的HashSet和HashTree幾個(gè)重寫方法

    簡(jiǎn)單的理解java集合中的HashSet和HashTree幾個(gè)重寫方法

    這篇文章主要介紹了簡(jiǎn)單的理解java集合中的HashSet和HashTree幾個(gè)重寫方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10

最新評(píng)論