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這個對象有關(guān),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配置值轉(zhuǎn)為int
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i, 127);
//配置的值若超過int類型能表示的最大值,肯定是不行的,同時也是因為緩存的對象都是存在了數(shù)組中而數(shù)組的大小也是有上線的,超過數(shù)組最大上限就緩存不下了
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會在第一次調(diào)用valueOf方法時將-128與127的Integer對象進行緩存.所有使用valueOf獲取的Integer對象若在范圍-128~127則都為緩存中的同一對象,而不在范圍內(nèi)的值則會重新new一個Integer對象.回過頭再看看開始的代碼輸出,是否跟預想的結(jié)果一致了呢
比較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方法內(nèi)部調(diào)用了intValue方法,該方法會返回Integer對象中使用int修飾的value值,這個過程就是所謂的拆包 System.out.println(a1 == a3);//false System.out.println(a1.equals(a3));//true
以上就是java基礎之Integer與int類型輸出示例解析的詳細內(nèi)容,更多關(guān)于java類型Integer int的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Spring Cache監(jiān)控配置與使用規(guī)范的建議
這篇文章主要介紹了Spring Cache監(jiān)控配置與使用規(guī)范的建議,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07
SpringBoot?+?layui?框架實現(xiàn)一周免登陸功能示例詳解
這篇文章主要介紹了SpringBoot+layui框架實現(xiàn)一周免登陸功能,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-08-08
spring boot 注入 property的三種方式(推薦)
這篇文章主要介紹了spring boot 注入 property的三種方式,需要的朋友可以參考下2017-07-07
如何解決Mybatis-plus中@TableLogic注解失效問題
這篇文章主要介紹了如何解決Mybatis-plus中@TableLogic注解失效問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05
java基于mongodb實現(xiàn)分布式鎖的示例代碼
本文主要介紹了java基于mongodb實現(xiàn)分布式鎖,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08

