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ò)頭再看看開(kāi)始的代碼輸出,是否跟預(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調(diào)用shell腳本及注意事項(xiàng)說(shuō)明
這篇文章主要介紹了java調(diào)用shell腳本及注意事項(xiàng)說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06Spring Cache監(jiān)控配置與使用規(guī)范的建議
這篇文章主要介紹了Spring Cache監(jiān)控配置與使用規(guī)范的建議,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07SpringBoot?+?layui?框架實(shí)現(xiàn)一周免登陸功能示例詳解
這篇文章主要介紹了SpringBoot+layui框架實(shí)現(xiàn)一周免登陸功能,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08spring boot 注入 property的三種方式(推薦)
這篇文章主要介紹了spring boot 注入 property的三種方式,需要的朋友可以參考下2017-07-07如何解決Mybatis-plus中@TableLogic注解失效問(wèn)題
這篇文章主要介紹了如何解決Mybatis-plus中@TableLogic注解失效問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05java基于mongodb實(shí)現(xiàn)分布式鎖的示例代碼
本文主要介紹了java基于mongodb實(shí)現(xiàn)分布式鎖,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08