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

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

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

引言

最近在讀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時,結(jié)論才成立。

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

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

相關(guān)文章

  • Java中HTTP接口請求重試的實現(xiàn)方式

    Java中HTTP接口請求重試的實現(xiàn)方式

    HTTP接口請求重試是指在請求失敗時,再次發(fā)起請求的機制,在實際應(yīng)用中,由于網(wǎng)絡(luò)波動、服務(wù)器故障等原因,HTTP接口請求可能會失敗,為了保證系統(tǒng)的可用性和穩(wěn)定性,需要對HTTP接口請求進行重試,所以本文給大家介紹了HTTP接口請求重試的實現(xiàn)方式,需要的朋友可以參考下
    2024-01-01
  • Spring實現(xiàn)自定義注解處理器解析和處理注解

    Spring實現(xiàn)自定義注解處理器解析和處理注解

    這篇文章主要介紹了Spring實現(xiàn)自定義注解處理器解析和處理注解,注解在現(xiàn)代Java編程中扮演了至關(guān)重要的角色,無論是簡化代碼、增強可讀性,還是將元數(shù)據(jù)與業(yè)務(wù)邏輯分離,注解都讓我們的代碼更加優(yōu)雅和靈活,需要的朋友可以參考下
    2024-10-10
  • Java Swing JPasswordField密碼框的實現(xiàn)示例

    Java Swing JPasswordField密碼框的實現(xiàn)示例

    這篇文章主要介紹了Java Swing JPasswordField密碼框的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • java協(xié)變返回類型使用示例

    java協(xié)變返回類型使用示例

    在面向?qū)ο蟪绦蛟O(shè)計中,協(xié)變返回類型指的是子類中的成員函數(shù)的返回值類型不必嚴格等同于父類中被重寫的成員函數(shù)的返回值類型,而可以是更"狹窄"的類型
    2014-02-02
  • 基于Springboot+Netty實現(xiàn)rpc的方法 附demo

    基于Springboot+Netty實現(xiàn)rpc的方法 附demo

    這篇文章主要介紹了基于Springboot+Netty實現(xiàn)rpc功能,在父項目中引入相關(guān)依賴結(jié)合實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • Java?超詳細講解字符流

    Java?超詳細講解字符流

    字符流就是在字節(jié)流的基礎(chǔ)上,加上編碼,形成的數(shù)據(jù)流,字符流出現(xiàn)的意義是因為字節(jié)流在操作字符時,可能會有中文導(dǎo)致的亂碼,所以由字節(jié)流引申出了字符流
    2022-04-04
  • Java中Jar包反編譯解壓和壓縮操作方法

    Java中Jar包反編譯解壓和壓縮操作方法

    JAR文件就是Java 檔案文件Java Archive,它是 Java 的一種文檔格式,這篇文章主要介紹了Java中Jar包反編譯解壓和壓縮,需要的朋友可以參考下
    2023-09-09
  • Java編程一道多線程問題實例代碼

    Java編程一道多線程問題實例代碼

    這篇文章主要介紹了Java編程一道多線程問題實例代碼,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02
  • JDK源碼中一些實用的“小技巧”總結(jié)

    JDK源碼中一些實用的“小技巧”總結(jié)

    這篇文章主要給大家總結(jié)介紹了關(guān)于JDK源碼中一些實用的“小技巧”,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用jdk源碼具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03
  • Java 中ThreadLocal類詳解

    Java 中ThreadLocal類詳解

    什么是ThreadLocal?顧名思義它是local variable(線程局部變量)。它的功用非常簡單,就是為每一個使用該變量的線程都提供一個變量值的副本,是每一個線程都可以獨立地改變自己的副本,而不會和其它線程的副本沖突。從線程的角度看,就好像每一個線程都完全擁有該變量。
    2016-03-03

最新評論