成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

深入理解Java的整型類型:如何實現(xiàn)2+2=5?

aristark / 2477人閱讀

摘要:先看下這段神奇的代碼執(zhí)行結果那么到底做了什么神奇的事情呢先看代碼所以這個例子其實包含了中整型類型的一個知識點。最后打印出來的值,實際上是的返回值。只有當輸入?yún)?shù)不在區(qū)間內(nèi),才執(zhí)行代碼,基于輸入?yún)?shù)創(chuàng)建一個新的實例。

先看下這段神奇的Java代碼:

public static void main(String[] args) throws Exception {

      doSomethingMagic();

      System.out.printf("2 + 2 = %d", 2 + 2);

}

執(zhí)行結果:2 + 2 = 5

那么doSomethingMagic到底做了什么神奇的事情呢?先看代碼:

private static void doSomethingMagic() throws Exception {

   Class cache = Integer.class.getDeclaredClasses()[0];

   Field c = cache.getDeclaredField("cache");

   c.setAccessible(true);

   Integer[] array = (Integer[]) c.get(cache);

   array[132] = array[133];

}

所以這個例子其實包含了Java中整型類型Integer的一個知識點。

可能有的朋友對于doSomethingMagic里面的代碼有點摸不著頭腦,讓我們先查看上圖第17行 2 + 2反編譯出來的代碼:

編輯器將2+ 2的值先計算出來,等于4。最后System.out.println打印出來的值,實際上是Integer.valueOf(4)的返回值。

那么我們就查看JDK里Integer.valueOf的實現(xiàn):

上面的實現(xiàn)代碼,從830行到832行,邏輯非常清楚:如果valueOf的參數(shù)i在IntegerCache.low和IntegerCache.high之間,即[-128, 127]的閉區(qū)間,則直接從IntegerCache這個緩存區(qū)域里返回。只有當輸入?yún)?shù)i不在[-128,127]區(qū)間內(nèi),才執(zhí)行代碼832,基于輸入?yún)?shù)i創(chuàng)建一個新的Integer實例。

帶著這個理念,我們再看doSomethingMagic就清楚多了。這個方法通過Java反射將上圖IntegerCache的成員cache設置成可訪問:setAccessible(true), 然后將IntegerCache的第132個元素的值用第133個元素的值覆蓋。

我們從Eclipse調試器里發(fā)現(xiàn),Integer cache里第132個元素的值為4,第133個元素的值為5。本來Integer.valueOf方法,對于輸入4,從Integer cache里返回第132個元素的值,即4?,F(xiàn)在這個元素的值被第133個元素即5覆蓋了,所以最后得到了 2 + 2 = 5。

用一句話概括這個場景: 2 + 2 = 4 = Integer.valueOf(4) = 5 ( 因為4在Integer cache里對應的記錄已經(jīng)被我們的代碼顯式替換成了5)。

要獲取更多Jerry的原創(chuàng)技術文章,請關注公眾號"汪子熙"或者掃描下面二維碼:

文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://systransis.cn/yun/71818.html

相關文章

  • 【C語言基礎之類型轉換】

    摘要:類型轉換的原則占用內(nèi)存字節(jié)數(shù)少值域小的類型,向占用內(nèi)存字節(jié)數(shù)多值域大的類型轉換,以保證精度不降低。隱式類型轉換隱式轉換也稱為自動轉換,遵循一定的規(guī)則,由編譯器自動完成。 ...

    jsliang 評論0 收藏0
  • 一文讀懂 Java 中的原子類

    摘要:一無鎖方案并發(fā)包中的原子類都是基于無鎖方案實現(xiàn)的,相較于傳統(tǒng)的互斥鎖,無鎖并沒有加鎖解鎖線程切換的消耗,因此無鎖解決方案的性能更好,同時無鎖還能夠保證線程安全。線程首先讀取的值并加,如果此時有另一個線程更新了,則期望值和不相等,更新失敗。 一、無鎖方案 Java 并發(fā)包中的原子類都是基于無鎖方案實現(xiàn)的,相較于傳統(tǒng)的互斥鎖,無鎖并沒有加鎖、解鎖、線程切換的消耗,因此無鎖解決方案的性能更好...

    jas0n 評論0 收藏0
  • Java 關鍵字專題

    摘要:和也許看起來像是關鍵字,但是他們專門用于表示布爾類型的字面量。值得注意的是,在中整形值和布爾值之間不能相互轉換至少在語言層面。相關的操作等于不等于取反位與異或或條件與條件或三目運算符在控制流程中使用一個布爾值可且僅可被轉型為,類型。 總覽 Java 語言中有 50 個關鍵字,這些關鍵字不能用作標識符,如下圖所示(來自 jls8) showImg(https://segmentfault...

    Dogee 評論0 收藏0
  • 【C語言初階】?? 教你使用C語言中的各種操作符(熟練運用+必須收藏)??

    本章目錄 溫馨提示本章重點正文開始1. 操作符分類2.算數(shù)操作符2.1 `/`操作符2.2 `%`操作符 3. 位移操作符3.1 ``左移操作符 4. 位操作符4.1 `&`按位與操作符4.2 `|`按位或操作符4.3 `^`按位異或操作符 5. 賦值操作符6. 單目操作符6.1 各種單目操作符6.2 sizeof 和 數(shù)組 7. 關系操作符(后面的操作符不單獨出現(xiàn)在目錄中)8. ...

    source 評論0 收藏0
  • 深入理解HashMap(二): 關鍵源碼逐行分析之hash算法

    摘要:散列函數(shù)把消息或數(shù)據(jù)壓縮成摘要,使得數(shù)據(jù)量變小,將數(shù)據(jù)的格式固定下來。該函數(shù)將數(shù)據(jù)打亂混合,重新創(chuàng)建一個叫做散列值,,,或的指紋。 前言 系列文章目錄 前面我們討論了HashMap的結構, 接下來幾篇我們從源碼角度來看HashMap的實現(xiàn)細節(jié). 本篇我們就來聊聊HashMap的hash算法 本文的源碼基于 jdk8 版本. hash算法 上一篇文章我們提到, 為了利用數(shù)組索引進行快速查...

    chunquedong 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<