Integer與int的種種比較你知道多少?

如果面試官問(wèn)Integer與int的區(qū)別:估計(jì)大多數(shù)人只會(huì)說(shuō)道兩點(diǎn),Ingeter是int的包裝類,int的初值為0,Ingeter的初值為null。但是如果面試官再問(wèn)一下Integer i = 1;int ii = 1; i==ii為true還是為false?估計(jì)就有一部分人答不出來(lái)了,如果再問(wèn)一下其他的,估計(jì)更多的人會(huì)頭腦一片混亂。所以我對(duì)它們進(jìn)行了總結(jié),希望對(duì)大家有幫助。
首先看代碼:

1packagecom.test;
2 /**
3 *
4 *@author劉玲
5 *
6 */
7 publicclassTestInteger {
8 
9 /**
10 *@paramargs
11 */
12 publicstaticvoidmain(String[] args) {
13 inti = 128;
14 Integer i2 = 128;
15 Integer i3 =newInteger(128);
16 //Integer會(huì)自動(dòng)拆箱為int,所以為true
17 System.out.println(i ==i2);
18 System.out.println(i ==i3);
19 System.out.println("**************");
20 Integer i5 = 127;//java在編譯的時(shí)候,被翻譯成-> Integer i5 = Integer.valueOf(127);
21 Integer i6 = 127;
22 System.out.println(i5 == i6);//true
23 /*Integer i5 = 128;
24 Integer i6 = 128;
25 System.out.println(i5 == i6);//false
26 */Integer ii5 =newInteger(127);
27 System.out.println(i5 == ii5);//false
28 Integer i7 =newInteger(128);
29 Integer i8 =newInteger(123);
30 System.out.println(i7 == i8);//false31}3233}

首先,17行和18行輸出結(jié)果都為true,因?yàn)镮nteger和int比都會(huì)自動(dòng)拆箱(jdk1.5以上)。
22行的結(jié)果為true,而25行則為false,很多人都不動(dòng)為什么。其實(shí)java在編譯Integer i5 = 127的時(shí)候,被翻譯成-> Integer i5 = Integer.valueOf(127);所以關(guān)鍵就是看valueOf()函數(shù)了。只要看看valueOf()函數(shù)的源碼就會(huì)明白了。JDK源碼的valueOf函數(shù)式這樣的:

1 publicstaticInteger valueOf(inti) {
2 assertIntegerCache.high >= 127;
3 if(i >= IntegerCache.low && i <=IntegerCache.high)
4 returnIntegerCache.cache[i + (-IntegerCache.low)];
5 returnnewInteger(i);
6 }

看一下源碼大家都會(huì)明白,對(duì)于-128到127之間的數(shù),會(huì)進(jìn)行緩存,Integer i5 = 127時(shí),會(huì)將127進(jìn)行緩存,下次再寫Integer i6 = 127時(shí),就會(huì)直接從緩存中取,就不會(huì)new了。所以22行的結(jié)果為true,而25行為false。
對(duì)于27行和30行,因?yàn)閷?duì)象不一樣,所以為false。
我對(duì)于以上的情況總結(jié)如下:
①無(wú)論如何,Integer與new Integer不會(huì)相等。不會(huì)經(jīng)歷拆箱過(guò)程,i3的引用指向堆,而i4指向?qū)iT存放他的內(nèi)存(常量池),他們的內(nèi)存地址不一樣,所以為false
②兩個(gè)都是非new出來(lái)的Integer,如果數(shù)在-128到127之間,則是true,否則為false
java在編譯Integer i2 = 128的時(shí)候,被翻譯成-> Integer i2 = Integer.valueOf(128);而valueOf()函數(shù)會(huì)對(duì)-128到127之間的數(shù)進(jìn)行緩存
③兩個(gè)都是new出來(lái)的,都為false
④int和integer(無(wú)論new否)比,都為true,因?yàn)闀?huì)把Integer自動(dòng)拆箱為int再去比

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容