您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“java中為什么int==Integer為true”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
先看現(xiàn)象吧
執(zhí)行下面的代碼及輸出結(jié)果:
int a = 1;Integer b = 1;Integer c = new Integer(1);System.out.println(a==b);//trueSystem.out.println(a==c);//trueSystem.out.println(b==c);//false
通常大家對(duì)此的解釋是,==對(duì)于基本類型來說比較的是值,對(duì)于引用類型來說比較的是引用,即指向的對(duì)象的內(nèi)存地址。這樣解釋沒錯(cuò),b==c結(jié)果為false毋庸置疑,因?yàn)閮蓚€(gè)都是引用類型。但是為什么a==b(a==c)一個(gè)是基本類型一個(gè)是引用類型,比較的時(shí)候還是值比較呢?
這個(gè)時(shí)候我們不妨把.java源文件編譯后的.class文件使用反編譯工具反編譯成源碼,看看虛擬機(jī)內(nèi)部是如何處理a==b的。
.class文件使用jd-gui反編譯后的:
int a = 1;Integer b = Integer.valueOf(1);Integer c = new Integer(1);System.out.println(a == b.intValue());System.out.println(a == c.intValue());System.out.println(b == c);
看到這想必大家都明白了吧,其實(shí)基本類型a和引用類型b比較時(shí),引用類型b調(diào)用自身的intValue()方法獲取Integer實(shí)際表示的int類型的值,即a == b.intValue()還是兩個(gè)int類型的變量進(jìn)行值比較。符合上述:==對(duì)于基本類型來說比較的是值,對(duì)于引用類型來說比較的是引用,即指向的對(duì)象的內(nèi)存地址。
說到這,還要解釋下為什么兩個(gè)引用類型的值一樣而引用不一樣以及基本變量為什么是值比較。
其實(shí)基本變量int a在內(nèi)存里只有一份,保存在棧(保存基本類型的變量數(shù)據(jù)及引用類型的引用)中,Integer b和Integer c中的int值都指向棧中同一個(gè)int,不會(huì)重新在棧中創(chuàng)建相同的int值。
而對(duì)于Integer b和Integer c,其實(shí)例是保存在堆(保存所有new出來的對(duì)象)中,雖然表示的int值相同,但是在堆中有兩份,每次new都會(huì)在堆中開辟一片空間保存new的內(nèi)容,故Integer b和Integer c分別在兩片不同的內(nèi)存空間存儲(chǔ),所以指向的內(nèi)存地址不同。
而對(duì)于Integer b = 1;其反編譯后為Integer b = Integer.valueOf(1); 而valueOf()方法內(nèi)部是調(diào)用了new。
JDK中Integer.valueOf()源碼:
public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i);}
“java中為什么int==Integer為true”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。