1.裝箱拆箱
Java中有8種基本類型怜械,但鑒于Java面向?qū)ο蟮奶攸c(diǎn)番宁,它們同樣有著對(duì)應(yīng)的8個(gè)包裝類型委粉,比如int和Integer野芒,包裝類型的值可以為null(基本類型沒有null值蓄愁,而數(shù)據(jù)庫的表中普遍存在null值。所以實(shí)體類中所有屬性均應(yīng)采用封裝類型)狞悲,很多時(shí)候撮抓,它們都能夠相互賦值。
請(qǐng)看如下實(shí)例
裝箱拆箱
通過觀察字節(jié)碼摇锋,我們發(fā)現(xiàn):
1丹拯、賦值操作使用的是Integer.valueOf方法站超。
2、在進(jìn)行乘法運(yùn)算的時(shí)候乖酬,調(diào)用了Integer.intValue方法來獲取基本類型的值死相。
3、在方法返回的時(shí)候咬像,再次使用了Integer.valueOf方法對(duì)結(jié)果進(jìn)行了包裝算撮。 這就是Java中的自動(dòng)裝箱拆箱的底層實(shí)現(xiàn)。
2.IntegerCache
這里有一個(gè)陷阱問題施掏,我們繼續(xù)跟蹤Integer.valueOf方法
這個(gè)IntegerCache钮惠,緩存了low和high之間的Integer對(duì)象。默認(rèn)low是-128七芭,high是127
IntegerCache默認(rèn)最小值和最大值
可以通過-XX:AutoBoxCacheMax來修改上限素挽,上限可以變,但是只能大于等于127.
下面是一道經(jīng)典的面試題狸驳,請(qǐng)考慮一下運(yùn)行代碼后预明,會(huì)輸出什么結(jié)果?
package sandwich.test5;
/**
* @author 公眾號(hào):三明治聊IT
* @date 2021/6/12
* -XX:AutoBoxCacheMax=256
*/
public class IntegerCacheTest {
public static void main(String[] args) {
Integer n1 = 123;
Integer n2 = 123;
Integer n3 = 130;
Integer n4 = 130;
System.out.println(n1 == n2);
System.out.println(n3 == n4);
}
}
結(jié)果是
true
false
一般情況下是是true,false因?yàn)榫彺娴脑虬夜俊#ㄔ诰彺娣秶鷥?nèi)的值撰糠,返回的是同一個(gè)緩存值,不在的話辩昆,每次都是new出來的) 當(dāng)我加上VM參數(shù) -XX:AutoBoxCacheMax=256執(zhí)行時(shí)阅酪,結(jié)果是true,ture,擴(kuò)大緩存范圍汁针,第二個(gè)為true原因就在于此术辐。