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

HashMap源碼中的位運算符&詳解

 更新時間:2020年07月24日 10:34:26   作者:Ethan_Wong  
這篇文章主要介紹了HashMap源碼中的位運算符&詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

引言

最近在讀HashMap源碼的時候,發(fā)現(xiàn)在很多運算符替代常規(guī)運算符的現(xiàn)象。比如說用hash & (table.length-1) 來替代取模運算hash&(table.length);用if((e.hash & oldCap) == 0)判斷擴容后元素的位置等等。

1.取模運算符%底層原理

​總所周知,位運算&直接對二進制進行運算;而對于取模運算符%:a % b 相當于 a - a / b * b,底層實際上是除法器,究其根源也是由底層的減法和加法共同完成。所以其運行效率要遠遠小于位運算符&。

2.位運算符&如何實現(xiàn)取模功能

​我們先來看兩個例子

5 & 7                9 & 7
0101----5            1001----9
&                         &
0111----7             0111----7
=                          =
0101----5             0001----1

​確實,hash & (table.length-1) 來實現(xiàn)了運算hash&(table.length)從二進制的角度來說,5%8實際上是將二進制5(0101)向右移動3位,而與7(0111)進行與運算實際上就是將位數(shù)向右移動三位。不過要注意的是,只有當length的長度為2^n時,結論才成立。

3.位運算符&在if((e.hash & oldCap) == 0)判斷擴容后元素的位置

​這是出自于JDK1.8中擴容函數(shù)resize()的一行代碼,用于判斷在擴容后原數(shù)組中的元素是否需要移動。舉個例子:

0001 1010----26                0000 1010----10                
&                              &
0001 0000----16                0001 0000----16
=                              =
0001 0000----非0               0000 0000-----0

利用hash值和oldCap進行與運算,很明顯當結果大于0代表hash值大于oldCap時,下標位置變?yōu)榕f數(shù)組的下標j + oldCap;若結果等于0代表小于oldCap,則下標位置不變。相比于JDK1.7重新計算每個元素的哈希值,通過高位運算(e.hash & oldCap)無疑效率更高。

到此這篇關于HashMap源碼中的位運算符&詳解的文章就介紹到這了,更多相關HashMap源碼中的位運算符&內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • SpringCloud微服務之Config知識總結

    SpringCloud微服務之Config知識總結

    今天帶大家學習SpringCloud微服務中的Config的相關知識,文中有非常詳細的介紹,對正在學習SpringCloud微服務的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05
  • SpringBoot如何實現(xiàn)持久化登錄狀態(tài)獲取

    SpringBoot如何實現(xiàn)持久化登錄狀態(tài)獲取

    這篇文章主要介紹了SpringBoot 如何實現(xiàn)持久化登錄狀態(tài)獲取,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 為什么Spring和IDEA都不推薦使用 @Autowired 注解

    為什么Spring和IDEA都不推薦使用 @Autowired 注解

    本文主要介紹了為什么Spring和IDEA都不推薦使用 @Autowired 注解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-04-04
  • Java8接口默認靜態(tài)方法及重復注解原理解析

    Java8接口默認靜態(tài)方法及重復注解原理解析

    這篇文章主要介紹了Java8接口默認靜態(tài)方法及重復注解原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • 解決springcloud中Feign導入依賴為unknow的情況

    解決springcloud中Feign導入依賴為unknow的情況

    這篇文章主要介紹了解決springcloud中Feign導入依賴為unknow的情況,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • javacv-ffmpeg ProcessBuilder批量旋轉圖片方式

    javacv-ffmpeg ProcessBuilder批量旋轉圖片方式

    為了批量處理大量圖片的旋轉,可以使用javacv-ffmpeg結合ProcessBuilder,首先在maven配置文件中添加ffmpeg及javacpp依賴,javacpp支持調用C/C++方法,而ffmpeg基于C語言,使用ProcessBuilder創(chuàng)建進程調用ffmpeg方法
    2024-09-09
  • 詳解Java線程堆棧

    詳解Java線程堆棧

    本篇文章主要給大家講了Java線程堆棧的詳細原理以及用法,需要的朋友跟著學習下吧。
    2017-12-12
  • Java 實戰(zhàn)項目之誠途旅游系統(tǒng)的實現(xiàn)流程

    Java 實戰(zhàn)項目之誠途旅游系統(tǒng)的實現(xiàn)流程

    讀萬卷書不如行萬里路,只學書上的理論是遠遠不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SpringBoot+Vue+maven+Mysql實現(xiàn)一個精美的物流管理系統(tǒng),大家可以在過程中查缺補漏,提升水平
    2021-11-11
  • 關于try 和 throw 簡單使用示例

    關于try 和 throw 簡單使用示例

    每過一段時間,就總是會對try有點生疏,特別寫了個程序來測試以下,有時候 throw是底層拋出來的,你不處理,默認就throw了
    2013-08-08
  • mybatis 新增返回id的實現(xiàn)

    mybatis 新增返回id的實現(xiàn)

    Mybatis插入數(shù)據(jù)時,可以通過兩種方式返回生成的ID,兩種方式都需要在實體類中提供userId的getter和setter方法,本文就詳細的介紹一下這兩種方法,感興趣的可以了解一下
    2024-09-09

最新評論

和平县| 乌恰县| 博罗县| 全州县| 江口县| 长治市| 绥化市| 元阳县| 乐业县| 喀喇沁旗| 皋兰县| 成武县| 永济市| 西乌珠穆沁旗| 将乐县| 谷城县| 吉安县| 利辛县| 灯塔市| 岗巴县| 吴旗县| 青浦区| 广灵县| 万荣县| 麻阳| 长子县| 泊头市| 屏东市| 沁源县| 西充县| 青河县| 密云县| 蛟河市| 禄丰县| 兴隆县| 渝北区| 西充县| 苏州市| 锦屏县| 宜兴市| 淮阳县|