java基礎(chǔ)之Integer與int類型輸出示例解析
正文
說(shuō)說(shuō)下面代碼的輸出:
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那就說(shuō)明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;
//用來(lái)存儲(chǔ)緩存的Integer對(duì)象
static final Integer cache[];
static {
int h = 127;
//從虛擬機(jī)配置中獲取配置"java.lang.Integer.IntegerCache.high"的值,可以自己修改虛擬機(jī)配置,默認(rèn)沒(méi)有該條配置
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);
//配置的值若超過(guò)int類型能表示的最大值,肯定是不行的,同時(shí)也是因?yàn)榫彺娴膶?duì)象都是存在了數(shù)組中而數(shù)組的大小也是有上線的,超過(guò)數(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ì)象.回過(guò)頭再看看開始的代碼輸出,是否跟預(yù)想的結(jié)果一致了呢
比較Integer與Integer的大小
若想比較Integer與Integer的大小,使用equals比較即可
再來(lái)看看下面代碼的輸出
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è)過(guò)程就是所謂的拆包 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)文章!
- JAVA?biginteger類bigdecimal類的使用示例學(xué)習(xí)
- Java Big Number操作BigInteger及BigDecimal類詳解
- Golang實(shí)現(xiàn)Biginteger大數(shù)計(jì)算實(shí)例詳解
- java并發(fā)JUC工具包AtomicInteger原子整型語(yǔ)法基礎(chǔ)
- 關(guān)于Integer.parseInt()方法的使用
- java如何將int數(shù)組轉(zhuǎn)化為Integer數(shù)組
- 使用RedisAtomicInteger計(jì)數(shù)出現(xiàn)少計(jì)問(wèn)題及解決
相關(guān)文章
Java+EasyExcel實(shí)現(xiàn)文件上傳功能
這篇文章主要為大家詳細(xì)介紹了如何通過(guò)Java和EasyExcel實(shí)現(xiàn)文件上傳功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-02-02
servlet上傳文件實(shí)現(xiàn)代碼詳解(四)
這篇文章主要為大家詳細(xì)介紹了servlet上傳文件的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09
Java實(shí)現(xiàn)從PLC讀取數(shù)據(jù)的常見(jiàn)主流且可行方案
要從PLC讀取數(shù)據(jù),Java本身并不直接支持PLC的通信協(xié)議,所以你需要借助一些中間件或庫(kù)來(lái)實(shí)現(xiàn),以下是幾種主流且可行的方案,大家可以根據(jù)自己的需要進(jìn)行選擇2026-03-03
詳解json string轉(zhuǎn)換為java bean及實(shí)例代碼
這篇文章主要介紹了詳解json string轉(zhuǎn)換為java bean及實(shí)例代碼的相關(guān)資料,這里提供實(shí)例代碼幫助大家理解,需要的朋友可以參考下2017-07-07
在idea中g(shù)it實(shí)現(xiàn)里查看歷史代碼方式
這篇文章主要介紹了在idea中g(shù)it里查看歷史代碼的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10
鴻蒙中的設(shè)備權(quán)限管理與申請(qǐng)?jiān)敿?xì)示例代碼
在移動(dòng)應(yīng)用開發(fā)中,權(quán)限管理是至關(guān)重要的一部分,尤其是在涉及用戶隱私或系統(tǒng)資源(如相機(jī)、位置、存儲(chǔ)等)的應(yīng)用中,這篇文章主要介紹了鴻蒙中的設(shè)備權(quán)限管理與申請(qǐng)的相關(guān)資料,需要的朋友可以參考下2025-08-08
SpringBoot服務(wù)訪問(wèn)路徑動(dòng)態(tài)處理方式
這篇文章主要介紹了SpringBoot服務(wù)訪問(wèn)路徑動(dòng)態(tài)處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
Spring工廠方法創(chuàng)建(實(shí)例化)bean實(shí)例代碼
這篇文章主要介紹了Spring工廠方法創(chuàng)建bean實(shí)例代碼,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01
從零開始學(xué)SpringBoot如何開始使用圖文詳解
這篇文章主要介紹了從零開始學(xué)SpringBoot如何開始使用,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09

