日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JDK源码 - BitSet的实现

發布時間:2023/12/18 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JDK源码 - BitSet的实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

java.util.BitSet是個很有趣的類,了解其內部實現對正確的使用非常重要。?

對象構造:?

Java代碼??
  • private?final?static?int?ADDRESS_BITS_PER_WORD?=?6;??
  • private?final?static?int?BITS_PER_WORD?=?1?<<?ADDRESS_BITS_PER_WORD;??
  • private?long[]?words;??
  • ??
  • private?static?int?wordIndex(int?bitIndex)?{??
  • ????return?bitIndex?>>?ADDRESS_BITS_PER_WORD;??
  • }??
  • ??
  • private?void?initWords(int?nbits)?{??
  • ????words?=?new?long[wordIndex(nbits-1)?+?1];??
  • }??
  • ??
  • public?BitSet()?{??
  • ????initWords(BITS_PER_WORD);??
  • ????...??
  • }??
  • ??
  • public?BitSet(int?nbits)?{??
  • ????...??
  • ????initWords(nbits);??
  • ????...??
  • }??


  • 從貼出來的代碼可以看出,long[] words這個數組是BitSet內部的關鍵實現,如果用戶在構造函數中輸入一個nbits變量,initWords方法會把這個數減1再右移6位加1,按照這個長度產生words數組的長度。?
    如果是輸入的28,那么words的長度是1,?
    如果是輸入的2^6?????? = 64,那么words的長度是1,?
    如果是輸入的2^6+1???? = 65,那么words的長度是2,?
    如果是輸入的(2^6)*2?? = 128,那么words的長度是2,?
    如果是輸入的(2^6)*2+1 = 129,那么words的長度是3,?
    如果是輸入的(2^6)*3?? = 192,那么words的長度是3,?
    如果是輸入的(2^6)*3+1 = 193,那么words的長度是4,?
    ...?

    到這里已經很清楚了,BitSet用long類型表示“位圖”,因為一個long是64bit,所以每個long表示64個數據,也就是說:數組中words中的第一個long表示0~63,第二個long表示64~127,第三個long表示128~191 ...?

    再看看get函數,檢測某個數是否被置位:?

    Java代碼??
  • public?boolean?get(int?bitIndex)?{??
  • ????if?(bitIndex?<?0)??
  • ????????throw?new?IndexOutOfBoundsException("bitIndex?<?0:?"?+?bitIndex);??
  • ...??
  • ????int?wordIndex?=?wordIndex(bitIndex);??
  • ????return?(wordIndex?<?wordsInUse)??
  • ????????&&?((words[wordIndex]?&?(1L?<<?bitIndex))?!=?0);??
  • }??

  • 說明:?
    - wordsInUse變量主要用來控制long的容量,當set的數值過大時,BitSet類可以擴充words數組的長度,這一點和很多集合類(例如ArrayList,HashMap)是相似的?
    - 下面的語句值得注意:?
    1L << bitIndex?
    一般看到這條語句,會認為bitIndex如果超過64位,高位會溢出并得到返回0,事實上這個1會重新循環到低位,也就是說:?
    1L << 64 返回為1。?
    術語上這叫循環左移,經過檢測java同樣支持循環右移,運行下面的測試:?

    Java代碼??
  • for?(int?i?=?0;i?<?70?;i++)??
  • ????System.out.println(i?+?"?="?+?(1?>>?i));??

  • 在i為0,32,64時,(1 >> i)重新為1,搞位運算編程的需要注意這個陷阱。?

    注: 經過仔細考慮和試驗,這里不是循環左移和循環右移,是一種比較“奇怪”的實現,回頭寫寫這個問題。?

    BitSet類的一個缺陷:?
    size方法屬于類的內部實現細節,導出成公有方法會讓不了解實現細節的開發人員很迷惑。?

    Java代碼??
  • public?int?size()?{??
  • ????return?words.length?*?BITS_PER_WORD;??
  • }??


  • 例如: 開發人員可能通過bitset.set(100)設置位,然后調用bitset.size(),如果不了解細節,很難理解為什么結果為128。?

    另外,如果實現位域(bit fields),應該考慮使用EnumSet,這一點可以參考Effective Java。

    轉載于:https://www.cnblogs.com/litaobupt/articles/3100070.html

    創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的JDK源码 - BitSet的实现的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 永久免费在线观看av | 亚洲欧美日韩视频一区 | 亚洲一级二级片 | 日本国产一区 | 欧美 亚洲 另类 激情 另类 | 天天撸一撸 | 波多野结衣乳巨码无在线 | 久久久久综合网 | 亚洲人成无码网站久久99热国产 | ⅹxxxxhd亚洲日本hd老师 | 国产成人精品一区二区三区四区 | 欧美日韩第一页 | av在线a| 亚洲国产精品区 | 亚洲天堂影视 | 亚洲综合色一区 | 岛国av中文字幕 | 欧美日韩第一页 | 国产精品日韩在线观看 | 久色综 | youjizzxxxxx| 毛片在线免费 | 欧美在线一区二区三区 | 求个黄色网址 | 老妇女玩小男生毛片 | 精品视频在线播放 | 成人免费网站视频 | 综合色婷婷一区二区亚洲欧美国产 | 欧美成人精品一区二区三区在线观看 | 蜜桃色一区二区三区 | 四虎网站在线观看 | 95视频在线| 欧美亚洲一级片 | yes4444视频在线观看 | 日本在线观看一区二区三区 | 午夜寂寞少妇 | 91porny九色91啦中文 | 国产人人看 | 日本高清网站 | 欧美激情成人 | 中文字幕在线播放 | 波多野结衣在线免费观看视频 | 亚洲影库 | 91成年人视频| 极品粉嫩小仙女高潮喷水久久 | 国产精品视频免费看 | 国产精品一区二区人妻喷水 | 国产亚洲精品久 | 少妇不卡视频 | 欧美性受xxxx | 中文字幕一区二区三区人妻不卡 | 午夜在线观看视频18 | 午夜视频在线看 | 色爱亚洲| 久久久不卡国产精品一区二区 | 中文字幕第一区综合 | 97在线看 | 久久加勒比 | 人人澡人人澡人人澡 | 又黄又爽视频在线观看 | 丰满少妇av | 91精品国产综合久久久蜜臀图片 | 少妇在线观看 | 99久久精品一区二区成人 | 成人动漫在线播放 | www,超碰| 人成午夜 | 久久亚洲AV成人无码国产野外 | 国产18页 | 99热这里只有精 | 欧美成人片在线观看 | 麻豆精品av | 东京热无码av一区二区 | 欧美久久伊人 | 自拍超碰在线 | 欧美精品在线一区 | 亚洲黄av| 日本美女一区二区三区 | 四虎精品久久 | 亚洲视频在线观看网站 | 国产丝袜精品视频 | 91福利区 | 一级黄色录像免费观看 | 久久久久人妻一区 | 午夜免费剧场 | 国产片网站 | 自由成熟xxxx色视频 | 国产大片一区二区 | www.日韩在线观看 | 亚洲AV无码精品国产 | 精品国产理论 | 公侵犯人妻中文字慕一区二区 | 国产伦精品一区二区三区在线观看 | 国产精品卡一卡二 | 四虎久久久 | 一区三区视频在线观看 | 欧美激情免费看 | 快播91| 国产又粗又猛又色又 |