java基礎(chǔ)之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為引用對(duì)象,那么兩個(gè)Integer對(duì)象使用"=="比較的就是空間地址,如果a1==a2那就說明a1與a2的空間地址是相同的,為什么會(huì)相同呢?b1與b2的空間地址又為什么不相同了呢?
實(shí)際上對(duì)于第一與第二行代碼,java在編譯期做了優(yōu)化,實(shí)際上執(zhí)行的代碼如下
Integer a1 = = Integer.valueOf(10);
那么為什么使用valueOf方法創(chuàng)建Integer對(duì)象時(shí)a1與a2的空間地址是相同的而b1與b2的空間地址又不同了呢?下圖為valueOf方法的源碼

從圖中可以看到對(duì)不同的值會(huì)采用不同的創(chuàng)建方式,這一切似乎都與IntegerCache這個(gè)對(duì)象有關(guān),cache為緩存的意思,不難猜出如果符合if中的條件則從緩存中獲取一個(gè)對(duì)象,不符合則會(huì)new一個(gè)對(duì)象.
進(jìn)入到類IntegerCache中
private static class IntegerCache {
//IntegerCache.low的值為-128,被final修飾表示必須賦值且賦值后便不可再次更改
static final int low = -128;
//high值雖也被final修飾但并未賦初值,意味著要在后面賦初值
static final int high;
//用來存儲(chǔ)緩存的Integer對(duì)象
static final Integer cache[];
static {
int h = 127;
//從虛擬機(jī)配置中獲取配置"java.lang.Integer.IntegerCache.high"的值,可以自己修改虛擬機(jī)配置,默認(rèn)沒有該條配置
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í)也是因?yàn)榫彺娴膶?duì)象都是存在了數(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() {}
}綜上可以看出在不修改虛擬機(jī)配置的情況下,Integer會(huì)在第一次調(diào)用valueOf方法時(shí)將-128與127的Integer對(duì)象進(jìn)行緩存.所有使用valueOf獲取的Integer對(duì)象若在范圍-128~127則都為緩存中的同一對(duì)象,而不在范圍內(nèi)的值則會(huì)重新new一個(gè)Integer對(duì)象.回過頭再看看開始的代碼輸出,是否跟預(yù)想的結(jié)果一致了呢
比較Integer與Integer的大小
若想比較Integer與Integer的大小,使用equals比較即可
再來看看下面代碼的輸出
Integer a1 = new Integer(100); int a2 = 100; Integer a3 = new Integer(100); //當(dāng)一個(gè)基本類型和一個(gè)包裝類型比較時(shí),包裝類型會(huì)被自動(dòng)拆包進(jìn)行比較 System.out.println(a1 == a2);//true //equals方法內(nèi)部調(diào)用了intValue方法,該方法會(huì)返回Integer對(duì)象中使用int修飾的value值,這個(gè)過程就是所謂的拆包 System.out.println(a1 == a3);//false System.out.println(a1.equals(a3));//true
以上就是java基礎(chǔ)之Integer與int類型輸出示例解析的詳細(xì)內(nèi)容,更多關(guān)于java類型Integer int的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java調(diào)用shell腳本及注意事項(xiàng)說明
這篇文章主要介紹了java調(diào)用shell腳本及注意事項(xiàng)說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
Spring Cache監(jiān)控配置與使用規(guī)范的建議
這篇文章主要介紹了Spring Cache監(jiān)控配置與使用規(guī)范的建議,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
SpringBoot?+?layui?框架實(shí)現(xiàn)一周免登陸功能示例詳解
這篇文章主要介紹了SpringBoot+layui框架實(shí)現(xiàn)一周免登陸功能,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08
spring boot 注入 property的三種方式(推薦)
這篇文章主要介紹了spring boot 注入 property的三種方式,需要的朋友可以參考下2017-07-07
如何解決Mybatis-plus中@TableLogic注解失效問題
這篇文章主要介紹了如何解決Mybatis-plus中@TableLogic注解失效問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
java基于mongodb實(shí)現(xiàn)分布式鎖的示例代碼
本文主要介紹了java基于mongodb實(shí)現(xiàn)分布式鎖,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08

