Integer i01=59的時候,會調(diào)用Integer的valueOf方法略板,
??public static Integer valueOf(inti) {
???? assert IntegerCache.high>= 127;
???? if(i >= IntegerCache.low&& i <= IntegerCache.high)
???? return IntegerCache.cache[i+ (-IntegerCache.low)];
???? return newInteger(i);
}
這個方法就是返回一個Integer對象眠菇,只是在返回之前边败,看作了一個判斷,判斷當前i的值是否在[-128,127]區(qū)別捎废,且IntegerCache中是否存在此對象笑窜,如果存在,則直接返回引用登疗,否則排截,創(chuàng)建一個新的對象。
在這里的話,因為程序初次運行匾寝,沒有59搬葬,所以,直接創(chuàng)建了一個新的對象艳悔。
int i02=59急凰,這是一個基本類型,存儲在棧中猜年。
Integer i03 =Integer.valueOf(59);因為IntegerCache中已經(jīng)存在此對象抡锈,所以,直接返回引用乔外。
Integer i04 = new Integer(59)床三;直接創(chuàng)建一個新的對象。
System.out.println(i01== i02); i01是Integer對象杨幼,i02是int撇簿,這里比較的不是地址,而是值差购。Integer會自動拆箱成int四瘫,然后進行值的比較芹枷。所以嫁佳,為真紫岩。
System.out.println(i01== i03);因為i03返回的是i01的引用抬伺,所以,為真原朝。
System.out.println(i03==i04);因為i04是重新創(chuàng)建的對象燎竖,所以i03,i04是指向不同的對象址芯,因此比較結(jié)果為假彰居。
System.out.println(i02== i04);因為i02是基本類型诚纸,所以此時i04會自動拆箱,進行值比較陈惰,所以咬清,結(jié)果為真。