摘要:類實際上是中中的緩存類,目的是節省內存消耗,提高程序性能。而當堆內存中的對象存儲非常多時,就有可能造成內存泄漏。使用頻率高創建對象也就越多,堆內存中的對象也就越多,所以也就會可能發生上述中的內存溢出等問題。
面試題:問以下代碼輸出的結果是多少?
public class IntegerTest { @Test public void test() { Integer a = 127; Integer b = 127; System.out.println(String.format("運行結果:%s", a == b)); a = 128; b = 128; System.out.println(String.format("運行結果:%s", a == b)); } }
如果不仔細看上面的代碼,那么我想很多人都會很快的說出運行的結果。但如果仔細查看代碼,卻不知道上述代碼中的要考察的相關知識時,我想也不一定能準確說出正確的運行結果。那么下面我們看一下上述代碼的運行結果:
運行結果:true 運行結果:false
你猜對了嗎?為什么上面的代碼顯示的結果居然是不一樣的呢?下面我們詳細分析一下上述代碼主要考察的知識點。
上述代碼主要考察的是Java中Integer包裝類對象的知識。但在這里有一個很隱性的知識點,也就IntegerCache對象。也就是因為這個對象的存在才導致上述代碼中運行的結果不一致的。下面我們來了解一下Java中IntegerCache對象的知識。
IntegerCache
IntegerCache類實際上是Java中Integer中的緩存類,目的是節省內存消耗,提高程序性能。因為我們知道,在Java中每創建一個對象,都會將對象存儲在堆內存中。而當堆內存中的對象存儲非常多時,就有可能造成內存泄漏。而在我們日常的項目開發中我們使有用Integer類型的頻率非常高。使用頻率高創建對象也就越多,堆內存中的對象也就越多,所以也就會可能發生上述中的內存溢出等問題。所以Java為了解決上述問題。于是設計了IntegerCache類,看名字就知道IntegerCache是個緩存類,既然是緩存類,目的就是可以將相關的數據緩存下來,這里的數據指的就是Integer類的值。也就是上述代碼中的等于右邊的數值。那既然IntegerCache類可以緩存數字,為什么上述代碼中的結果不一樣呢?這個原因就是IntegerCache類有一個緩存范圍。IntegerCache類緩存的數據范圍為是-128到127之間。所以上述代碼中前兩行代碼中輸出結果為true(127在IntegerCache類緩存的數據范圍內,于是將127緩存起來,當程序在使用這個127數字時,因為緩存中已經有了,于是直接使用緩存中的127,所以結果為true),而后二行代碼輸出的結果為false(超出IntegerCache類的緩存范圍,于是不能緩存,所以創建了新的對象,既然是新的對象結果顯然是false)。
為了驗證我們上述我說的,我們看一下IntegerCache類的底層實現。下面為源碼:
/** * Cache to support the object identity semantics of autoboxing for values between * -128 and 127 (inclusive) as required by JLS. * * The cache is initialized on first usage. The size of the cache * may be controlled by the {@code -XX:AutoBoxCacheMax=} option. * During VM initialization, java.lang.Integer.IntegerCache.high property * may be set and saved in the private system properties in the * sun.misc.VM class. */ private static class IntegerCache { static final int low = -128; static final int high; static final Integer cache[]; static { // high value may be configured by property int h = 127; String integerCacheHighPropValue = sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high"); if (integerCacheHighPropValue != null) { try { int i = parseInt(integerCacheHighPropValue); i = Math.max(i, 127); // Maximum array size is Integer.MAX_VALUE h = Math.min(i, Integer.MAX_VALUE - (-low) -1); } catch( NumberFormatException nfe) { // If the property cannot be parsed into an int, ignore it. } } high = h; cache = new Integer[(high - low) + 1]; int j = low; for(int k = 0; k < cache.length; k++) cache[k] = new Integer(j++); // range [-128, 127] must be interned (JLS7 5.1.7) assert IntegerCache.high >= 127; } private IntegerCache() {} }
看源碼中的注釋我們知道,我們可以通過Jvm中的AutoBoxCacheMax參數來重新設置IntegerCache類的緩存范圍。并且我們知道IntegerCache類使用了Integer cache[] 數據緩存數值。
這就是上述面試題中所要考察的相關知識,實際上除IntegerCache類之外,在Java中還提供了ByteCache、ShortCache、LongCache、CharacterCache等緩存對象,其中前三個緩存對象的緩存范圍都是-128 到 127。而CharacterCache緩存對象則是0到127。這就是Java中IntegerCache類相關的知識,如有考慮不周,或者輸寫有誤的地方,歡迎留言,謝謝。
原文鏈接:http://jilinwula.com/article/...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69473.html
摘要:整型對象在內部實現中通過使用相同的對象引用實現了緩存和重用。這種緩存策略僅在自動裝箱的時候有用,使用構造器創建的對象不能被緩存。行的結果為而行則為。所以行的結果為而行為。中其他類似的緩存的緩存上限可以通過虛擬機參數修改,的緩存則沒法修改。 Java5為Integer的操作引入了一個新的特性,用來節省內存和提高性能。整型對象在內部實現中通過使用相同的對象引用實現了緩存和重用。上面的規則默...
摘要:基礎系列的與方法類初始化順序線程池如何彈性伸縮的幾個要點的緩存什么場景下使用阻塞隊列的使用及模式中的序本文主要簡述的緩存。而如果大于或小于則它所指向的對象將符合垃圾回收的條件使用,在模式下,使用參數即可將的自動緩存區間設置為。 Java基礎系列 Java的hashcode與equals方法 Java類初始化順序 ThreadPoolExecutor線程池如何彈性伸縮 HashMap的...
摘要:先看下這段神奇的代碼執行結果那么到底做了什么神奇的事情呢先看代碼所以這個例子其實包含了中整型類型的一個知識點。最后打印出來的值,實際上是的返回值。只有當輸入參數不在區間內,才執行代碼,基于輸入參數創建一個新的實例。 先看下這段神奇的Java代碼: public static void main(String[] args) throws Exception { doSom...
摘要:昨晚與一同事聊天,他正在找工作,讓我問他點常見面試題,然后發現他對的實現原理不是太清楚,他錯誤地以為只要不超過范圍的兩個對象就能用進行比較,但其實并不是這樣的這里先上一個例子運行結果如下下面說一下,原理實現內部有一個靜態變量池存放了一個 昨晚與一同事聊天,他正在找工作,讓我問他點常見面試題,然后發現他對Integer, Long, BigDecimal的實現原理不是太清楚,他錯誤地以為...
摘要:還有需要注意的一點是,此類緩存行為不僅存在于對象。還存在于其他的整數類型,,,。但是能改變緩存范圍的就只有了。 前言 最近跟許多朋友聊了下,在這個跳槽的黃金季節,大家都有點蠢蠢欲動,所以最近就多聊聊面試的時候需要注意的一些問題,這些問題不一定多深奧,多復雜,但是一不注意的話卻容易掉坑。下面看一下面試的時候經常遇到的一段代碼: public class IntegerDemo { ...
閱讀 2609·2021-11-17 17:00
閱讀 1864·2021-10-11 10:57
閱讀 3716·2021-09-09 11:33
閱讀 911·2021-09-09 09:33
閱讀 3550·2019-08-30 14:20
閱讀 3312·2019-08-29 11:25
閱讀 2796·2019-08-26 13:48
閱讀 734·2019-08-26 11:52