java基礎之Integer與int類型輸出示例解析
正文
說說下面代碼的輸出:
Integer a1 = 10, b1 = 128; Integer a2 = 10, b2 = 128; Integer a3 = new Integer(10); Integer b3 = new Integer(128); System.out.println(a1==a2);//true System.out.println(a1==a3);//false System.out.println(b1==b2);//false System.out.println(b1==b3);//false
代碼詳解
Integer為引用對象,那么兩個Integer對象使用"=="比較的就是空間地址,如果a1==a2那就說明a1與a2的空間地址是相同的,為什么會相同呢?b1與b2的空間地址又為什么不相同了呢?
實際上對于第一與第二行代碼,java在編譯期做了優(yōu)化,實際上執(zhí)行的代碼如下
Integer a1 = = Integer.valueOf(10);
那么為什么使用valueOf方法創(chuàng)建Integer對象時a1與a2的空間地址是相同的而b1與b2的空間地址又不同了呢?下圖為valueOf方法的源碼
從圖中可以看到對不同的值會采用不同的創(chuàng)建方式,這一切似乎都與IntegerCache這個對象有關,cache為緩存的意思,不難猜出如果符合if中的條件則從緩存中獲取一個對象,不符合則會new一個對象.
進入到類IntegerCache中
private static class IntegerCache { //IntegerCache.low的值為-128,被final修飾表示必須賦值且賦值后便不可再次更改 static final int low = -128; //high值雖也被final修飾但并未賦初值,意味著要在后面賦初值 static final int high; //用來存儲緩存的Integer對象 static final Integer cache[]; static { int h = 127; //從虛擬機配置中獲取配置"java.lang.Integer.IntegerCache.high"的值,可以自己修改虛擬機配置,默認沒有該條配置 String integerCacheHighPropValue = sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high"); if (integerCacheHighPropValue != null) { try { //將獲取的String配置值轉為int int i = parseInt(integerCacheHighPropValue); i = Math.max(i, 127); //配置的值若超過int類型能表示的最大值,肯定是不行的,同時也是因為緩存的對象都是存在了數組中而數組的大小也是有上線的,超過數組最大上限就緩存不下了 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++); assert IntegerCache.high >= 127; } private IntegerCache() {} }
綜上可以看出在不修改虛擬機配置的情況下,Integer會在第一次調用valueOf方法時將-128與127的Integer對象進行緩存.所有使用valueOf獲取的Integer對象若在范圍-128~127則都為緩存中的同一對象,而不在范圍內的值則會重新new一個Integer對象.回過頭再看看開始的代碼輸出,是否跟預想的結果一致了呢
比較Integer與Integer的大小
若想比較Integer與Integer的大小,使用equals比較即可
再來看看下面代碼的輸出
Integer a1 = new Integer(100); int a2 = 100; Integer a3 = new Integer(100); //當一個基本類型和一個包裝類型比較時,包裝類型會被自動拆包進行比較 System.out.println(a1 == a2);//true //equals方法內部調用了intValue方法,該方法會返回Integer對象中使用int修飾的value值,這個過程就是所謂的拆包 System.out.println(a1 == a3);//false System.out.println(a1.equals(a3));//true
以上就是java基礎之Integer與int類型輸出示例解析的詳細內容,更多關于java類型Integer int的資料請關注腳本之家其它相關文章!
相關文章
Spring Cache監(jiān)控配置與使用規(guī)范的建議
這篇文章主要介紹了Spring Cache監(jiān)控配置與使用規(guī)范的建議,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07SpringBoot?+?layui?框架實現一周免登陸功能示例詳解
這篇文章主要介紹了SpringBoot+layui框架實現一周免登陸功能,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-08-08spring boot 注入 property的三種方式(推薦)
這篇文章主要介紹了spring boot 注入 property的三種方式,需要的朋友可以參考下2017-07-07如何解決Mybatis-plus中@TableLogic注解失效問題
這篇文章主要介紹了如何解決Mybatis-plus中@TableLogic注解失效問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05