新聞中心
Integer類和int類在Java 中有什么不同?針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡(jiǎn)單易行的方法。
成都創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),安福企業(yè)網(wǎng)站建設(shè),安福品牌網(wǎng)站建設(shè),網(wǎng)站定制,安福網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,安福網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
代碼實(shí)例如下
public static void main(String[] args) { Integer i = 10; Integer j = 10; System.out.println(i == j); Integer a = 128; Integer b = 128; System.out.println(a == b); int k = 10; System.out.println(k == i); int kk = 128; System.out.println(kk == a); Integer m = new Integer(10); Integer n = new Integer(10); System.out.println(m == n); }
我們使用反編譯工具Jad,得到的代碼如下:
public static void main(String args[]) { Integer i = Integer.valueOf(10); Integer j = Integer.valueOf(10); System.out.println(i == j); Integer a = Integer.valueOf(128); Integer b = Integer.valueOf(128); System.out.println(a == b); int k = 10; System.out.println(k == i.intValue()); int kk = 128; System.out.println(kk == a.intValue()); Integer m = new Integer(10); Integer n = new Integer(10); System.out.println(m == n); }
打印結(jié)果為:
首先,直接聲明Integer i = 10,會(huì)自動(dòng)裝箱變?yōu)镮nteger i = Integer.valueOf(10);Integer i 會(huì)自動(dòng)拆箱為 i.intValue()。
①、第一個(gè)打印結(jié)果為 true
對(duì)于 i == j ,我們知道這是兩個(gè)Integer類,他們比較應(yīng)該是用equals,這里用==比較的是地址,那么結(jié)果肯定為false,但是實(shí)際上結(jié)果為true,這是為什么?
我們進(jìn)入到Integer 類的valueOf()方法:
分析源碼我們可以知道在 i >= -128 并且 i <= 127 的時(shí)候,第一次聲明會(huì)將 i 的值放入緩存中,第二次直接取緩存里面的數(shù)據(jù),而不是重新創(chuàng)建一個(gè)Ingeter 對(duì)象。那么第一個(gè)打印結(jié)果因?yàn)?i = 10 在緩存表示范圍內(nèi),所以為 true。
②、第二個(gè)打印結(jié)果為 false
從上面的分析我們知道,128是不在-128到127之間的,所以第一次創(chuàng)建對(duì)象的時(shí)候沒有緩存,第二次創(chuàng)建了一個(gè)新的Integer對(duì)象。故打印結(jié)果為false
③、第三個(gè)打印結(jié)果為 true
Integer 的自動(dòng)拆箱功能,也就是比較兩個(gè)基本數(shù)據(jù)類型,結(jié)果當(dāng)然為true
④、第四個(gè)打印結(jié)果為 true
解釋和第三個(gè)一樣。int和integer(無論new否)比,都為true,因?yàn)闀?huì)把Integer自動(dòng)拆箱為int再去比較。
⑤、第五個(gè)打印結(jié)果為 false
因?yàn)檫@個(gè)雖然值為10,但是我們都是通過 new 關(guān)鍵字來創(chuàng)建的兩個(gè)對(duì)象,是不存在緩存的概念的。兩個(gè)用new關(guān)鍵字創(chuàng)建的對(duì)象用 == 進(jìn)行比較,結(jié)果當(dāng)然為 false。
5、測(cè)試
Integer a = 1;
Integer b = 2;
Integer c = 3;
Integer d = 3;
Integer e = 321;
Integer f = 321;
Long g = 3L;
Long h = 2L;
System.out.println(c == d);
System.out.println(e == f);
System.out.println(c == (a + b));
System.out.println(c.equals((a+b)));
System.out.println(g == (a+b));
System.out.println(g.equals(a+b));
System.out.println(g.equals(a+h));
反編譯結(jié)果:
分析:第一個(gè)和第二個(gè)結(jié)果沒什么疑問,Integer類在-128到127的緩存問題;
第三個(gè)由于 a+b包含了算術(shù)運(yùn)算,因此會(huì)觸發(fā)自動(dòng)拆箱過程(會(huì)調(diào)用intValue方法),==比較符又將左邊的自動(dòng)拆箱,因此它們比較的是數(shù)值是否相等。
第四個(gè)對(duì)于c.equals(a+b)會(huì)先觸發(fā)自動(dòng)拆箱過程,再觸發(fā)自動(dòng)裝箱過程,也就是說a+b,會(huì)先各自調(diào)用intValue方法,得到了加法運(yùn)算后的數(shù)值之后,便調(diào)用Integer.valueOf方法,再進(jìn)行equals比較。
第五個(gè)對(duì)于 g == (a+b),首先計(jì)算 a+b,也是先調(diào)用各自的intValue方法,得到數(shù)值之后,由于前面的g是Long類型的,也會(huì)自動(dòng)拆箱為long,==運(yùn)算符能將隱含的將小范圍的數(shù)據(jù)類型轉(zhuǎn)換為大范圍的數(shù)據(jù)類型,也就是int會(huì)被轉(zhuǎn)換成long類型,兩個(gè)long類型的數(shù)值進(jìn)行比較。
第六個(gè)對(duì)于 g.equals(a+b),同理a+b會(huì)先自動(dòng)拆箱,然后將結(jié)果自動(dòng)裝箱,需要說明的是equals 運(yùn)算符不會(huì)進(jìn)行類型轉(zhuǎn)換。所以是Long.equals(Integer),結(jié)果當(dāng)然是false
第七個(gè)對(duì)于g.equals(a+h),運(yùn)算符+會(huì)進(jìn)行類型轉(zhuǎn)換,a+h各自拆箱之后是int+long,結(jié)果是long,然后long進(jìn)行自動(dòng)裝箱為L(zhǎng)ong,兩個(gè)Long進(jìn)行equals判斷。
關(guān)于Integer類和int類在Java 中有什么不同問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。
文章標(biāo)題:Integer類和int類在Java中有什么不同
分享路徑:http://www.dlmjj.cn/article/pscpis.html