摘要:先看下這段神奇的代碼執行結果那么到底做了什么神奇的事情呢先看代碼所以這個例子其實包含了中整型類型的一個知識點。最后打印出來的值,實際上是的返回值。只有當輸入參數不在區間內,才執行代碼,基于輸入參數創建一個新的實例。
先看下這段神奇的Java代碼:
public static void main(String[] args) throws Exception { doSomethingMagic(); System.out.printf("2 + 2 = %d", 2 + 2); }
執行結果: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的實現:
上面的實現代碼,從830行到832行,邏輯非常清楚:如果valueOf的參數i在IntegerCache.low和IntegerCache.high之間,即[-128, 127]的閉區間,則直接從IntegerCache這個緩存區域里返回。只有當輸入參數i不在[-128,127]區間內,才執行代碼832,基于輸入參數i創建一個新的Integer實例。
帶著這個理念,我們再看doSomethingMagic就清楚多了。這個方法通過Java反射將上圖IntegerCache的成員cache設置成可訪問:setAccessible(true), 然后將IntegerCache的第132個元素的值用第133個元素的值覆蓋。
我們從Eclipse調試器里發現,Integer cache里第132個元素的值為4,第133個元素的值為5。本來Integer.valueOf方法,對于輸入4,從Integer cache里返回第132個元素的值,即4?,F在這個元素的值被第133個元素即5覆蓋了,所以最后得到了 2 + 2 = 5。
用一句話概括這個場景: 2 + 2 = 4 = Integer.valueOf(4) = 5 ( 因為4在Integer cache里對應的記錄已經被我們的代碼顯式替換成了5)。
要獲取更多Jerry的原創技術文章,請關注公眾號"汪子熙"或者掃描下面二維碼:
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71818.html
摘要:類型轉換的原則占用內存字節數少值域小的類型,向占用內存字節數多值域大的類型轉換,以保證精度不降低。隱式類型轉換隱式轉換也稱為自動轉換,遵循一定的規則,由編譯器自動完成。 ...
摘要:一無鎖方案并發包中的原子類都是基于無鎖方案實現的,相較于傳統的互斥鎖,無鎖并沒有加鎖解鎖線程切換的消耗,因此無鎖解決方案的性能更好,同時無鎖還能夠保證線程安全。線程首先讀取的值并加,如果此時有另一個線程更新了,則期望值和不相等,更新失敗。 一、無鎖方案 Java 并發包中的原子類都是基于無鎖方案實現的,相較于傳統的互斥鎖,無鎖并沒有加鎖、解鎖、線程切換的消耗,因此無鎖解決方案的性能更好...
摘要:和也許看起來像是關鍵字,但是他們專門用于表示布爾類型的字面量。值得注意的是,在中整形值和布爾值之間不能相互轉換至少在語言層面。相關的操作等于不等于取反位與異或或條件與條件或三目運算符在控制流程中使用一個布爾值可且僅可被轉型為,類型。 總覽 Java 語言中有 50 個關鍵字,這些關鍵字不能用作標識符,如下圖所示(來自 jls8) showImg(https://segmentfault...
本章目錄 溫馨提示本章重點正文開始1. 操作符分類2.算數操作符2.1 `/`操作符2.2 `%`操作符 3. 位移操作符3.1 ``左移操作符 4. 位操作符4.1 `&`按位與操作符4.2 `|`按位或操作符4.3 `^`按位異或操作符 5. 賦值操作符6. 單目操作符6.1 各種單目操作符6.2 sizeof 和 數組 7. 關系操作符(后面的操作符不單獨出現在目錄中)8. ...
摘要:散列函數把消息或數據壓縮成摘要,使得數據量變小,將數據的格式固定下來。該函數將數據打亂混合,重新創建一個叫做散列值,,,或的指紋。 前言 系列文章目錄 前面我們討論了HashMap的結構, 接下來幾篇我們從源碼角度來看HashMap的實現細節. 本篇我們就來聊聊HashMap的hash算法 本文的源碼基于 jdk8 版本. hash算法 上一篇文章我們提到, 為了利用數組索引進行快速查...
閱讀 2619·2021-10-12 10:12
閱讀 778·2019-08-29 17:25
閱讀 2780·2019-08-29 17:24
閱讀 3203·2019-08-29 17:19
閱讀 1792·2019-08-29 15:39
閱讀 3031·2019-08-26 16:50
閱讀 1983·2019-08-26 12:17
閱讀 2694·2019-08-26 12:16