什么叫自動(dòng)裝箱和拆箱
簡(jiǎn)單來說:
自動(dòng)裝箱:就是自動(dòng)將基礎(chǔ)類型轉(zhuǎn)換為包裝器類型
自動(dòng)拆箱:就是自動(dòng)將包裝器類型轉(zhuǎn)換為基礎(chǔ)類型
// 自動(dòng)裝箱
Integer num1 = 400;
// 自動(dòng)拆箱
int num2 = num1;
根據(jù)概念肋层,那么8種基礎(chǔ)類型都支持自動(dòng)裝箱和拆箱帽馋,他們都各自對(duì)應(yīng)一種包裝類型:
如何自動(dòng)裝箱&&拆箱
我們可以通過反編譯class文件呈宇,得到編譯器生成的字節(jié)碼
源代碼:
public class TestBox {
public static void main(String[] args) {
// 自動(dòng)裝箱
Integer num1 = 400;
// 自動(dòng)拆箱
int num2 = num1;
}
}
通過命令行javap -c TestBox.class
得到對(duì)應(yīng)的字節(jié)碼:
public class TestBox {
public TestBox();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: sipush 400
3: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
6: astore_1
7: aload_1
8: invokevirtual #3 // Method java/lang/Integer.intValue:()I
11: istore_2
12: return
}
通過字節(jié)碼可以看到,編譯器幫我們自動(dòng)完成了拆箱和裝箱的過程。
-
可以看到苗分,裝箱過程其實(shí)就是通過調(diào)用
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); }
最后一句
return new Integer(i)
就比較簡(jiǎn)單了正驻,直接返回包裝類對(duì)象弊攘。我們主要看一下這個(gè)if
判斷,當(dāng)i
小于127姑曙,大于-128時(shí)襟交, 這時(shí)候是返回的緩存:static { .... cache = new Integer[(high - low) + 1]; int j = low; for(int k = 0; k < cache.length; k++) cache[k] = new Integer(j++); // range [-128, 127] must be interned (JLS7 5.1.7) assert IntegerCache.high >= 127; }
系統(tǒng)幫我們緩存從-128——127的包裝類對(duì)象,當(dāng)我們?nèi)ナ褂玫臅r(shí)候伤靠,可以直接使用捣域。我們可以通過程序驗(yàn)證一下:
public class TestBox { public static void main(String[] args) { // 自動(dòng)裝箱 Integer num1 = 400; // 自動(dòng)拆箱 int num2 = num1; Integer n1 = 100; Integer n2 = 100; Integer n3 = 200; Integer n4 = 200; System.out.println(n1==n2); // true System.out.println(n3==n4); // false } }
輸出結(jié)果:
true false
可以看到,因?yàn)?00<127,所以
n1
和n2
兩個(gè)兩個(gè)對(duì)象其實(shí)指向的是同一個(gè)對(duì)象宴合,而n3
和n4
指向的是不同的包裝類對(duì)象 -
我們?cè)谡f一下拆箱過程焕梅,編譯器自動(dòng)為我們調(diào)用了
Integer.intValue()
方法進(jìn)行拆箱public int intValue() { return value; }
拆箱就很簡(jiǎn)單了,直接返回
int
值
總結(jié)
- 需要知道什么叫拆箱&&裝箱
- 需要知道什么時(shí)候進(jìn)行拆箱&&裝箱
- 因?yàn)檠b箱會(huì)創(chuàng)建包裝類對(duì)象卦洽,所以頻繁的裝箱會(huì)消耗內(nèi)存贞言,影響性能。所以能避免就避免
- equals(Object o) 因?yàn)樵璭quals方法中的參數(shù)類型是封裝類型阀蒂,所傳入的參數(shù)類型(a)是原始數(shù)據(jù)類型该窗,所以會(huì)自動(dòng)對(duì)其裝箱弟蚀,反之,會(huì)對(duì)其進(jìn)行拆箱