鍍金池/ 問(wèn)答/Java  網(wǎng)絡(luò)安全/ JAVA中關(guān)于使用==和println時(shí)到底發(fā)生了什么

JAVA中關(guān)于使用==和println時(shí)到底發(fā)生了什么

Integer a = 1;
Integer b = 2;
Long c = 3L;
//c = a+b;//編譯出錯(cuò),會(huì)出現(xiàn)int不能轉(zhuǎn)為long的錯(cuò)誤
System.out.println(c==(a+b));//正常編譯,結(jié)果為true

為什么?
我知道int和long相加的時(shí)候會(huì)都轉(zhuǎn)化為long,和這個(gè)有關(guān)系嗎?
對(duì)于System.out.println(c==(a+b))
首先會(huì)將a、b拆箱成int,然后相加,最后的結(jié)果應(yīng)該是個(gè)int,c是個(gè)long,首先他們類型不同,IntegerCache和LongCache的地址肯定也不相同。

還有,對(duì)于《深入理解JVM》中有這樣一句話,“包裝類的“==”運(yùn)算在不遇到算術(shù)運(yùn)算的情況下不會(huì)自動(dòng)拆箱”是什么意思

回答
編輯回答
爛人

c=a+b是c = a.intValue() + b.intValue()的簡(jiǎn)寫(xiě),兩個(gè)int相加結(jié)果還是int,必須顯示轉(zhuǎn)換為long才可以。比如c = (long)(a+b)。c==(a+b)是對(duì)比兩個(gè)reference是不是指向同一個(gè)對(duì)象,jvm會(huì)優(yōu)化一部分整數(shù),我記得是-128到128的object。如果有兩個(gè)整數(shù)一樣,會(huì)指向同一個(gè)對(duì)象。比如Integer a = 12; Integer b=12; a==b是true。

2017年10月15日 04:34
編輯回答
執(zhí)念
c==(a+b),三個(gè)包裝型a,b,c全部拆箱
c=Long.longValue(c);返回基本數(shù)據(jù)類型long
a和b使用Integer.intValue(a);返回的是基本數(shù)據(jù)類型int,
c==(a+b)他們之間是基本類型數(shù)值的比較,所以為true

包裝類的“==”運(yùn)算在不遇到算術(shù)運(yùn)算的情況下不會(huì)自動(dòng)拆箱
上面的c==(a+b)有+號(hào)是算術(shù)運(yùn)算符所以會(huì)自動(dòng)拆箱
如果是c==a,沒(méi)有算術(shù)運(yùn)算符不會(huì)拆箱,編譯報(bào)錯(cuò)Incompatible operand types Integer and Long

2018年3月12日 15:01