Java裝箱與拆箱詳解(附實例代碼)

本文是本站小編搜索整理的主要介紹Java 裝箱與拆箱詳解及實例代碼的相關資料,對java 的裝箱及拆箱進行了基本概念詳解及簡單使用,供參考學習,希望對大家有所幫助!想了解更多相關信息請持續關注我們應屆畢業生考試網!

Java裝箱與拆箱詳解(附實例代碼)

  前言:

要理解裝箱和拆箱的概念,就要理解Java數據類型

裝箱:把基本類型用它們相應的引用類型包裝起來,使其具有對象的性質。int包裝成Integer、float包裝成Float

拆箱:和裝箱相反,將引用類型的對象簡化成值類型的數據

Integer a = 100; 這是自動裝箱 (編譯器調用的是static Integer valueOf(int i))

int b = new Integer(100); 這是自動拆箱

  看下面一段代碼

  m1

public class DataType {

public static void main(String args[]) {

DataType dt = new DataType();

dt.m11();

dt.m12();

}

public void m11() {

Integer a = new Integer(100);

Integer b = 100;

tln("m11 result " + (a == b));

}

public void m12() {

Integer a = new Integer(128);

Integer b = 128;

tln("m12 result " + (a == b));

}

}

  打印結果是什麼?

m11 result false

m12 result false

“==”比較的是地址,而a和b兩個對象的地址不同,即是兩個對象,所以都是false

通過javap解析字節碼,內容如下

public void m11();

Code:

0: new #44; //class java/lang/Integer

3: dup

4: bipush 100

6: invokespecial #46; //Method java/lang/Integer."<init>":(I)V

9: astore_1

10: bipush 100

12: invokestatic #49; //Method java/lang/eOf:(I)Ljava/lang/In

teger;

15: astore_2

16: getstatic #53; //Field java/lang/:Ljava/io/PrintStream;

19: new #59; //class java/lang/StringBuilder

22: dup

23: ldc #61; //String m11 result

25: invokespecial #63; //Method java/lang/StringBuilder."<init>":(Ljava/la

ng/String;)V

28: aload_1

29: aload_2

30: if_acmpne 37

33: iconst_1

34: goto 38

37: iconst_0

38: invokevirtual #66; //Method java/lang/nd:(Z)Ljava/la

ng/StringBuilder;

41: invokevirtual #70; //Method java/lang/ring:()Ljava/l

ang/String;

44: invokevirtual #74; //Method java/io/tln:(Ljava/lang/St

ring;)V

47: return

public void m12();

Code:

0: new #44; //class java/lang/Integer

3: dup

4: sipush 128

7: invokespecial #46; //Method java/lang/Integer."<init>":(I)V

10: astore_1

11: sipush 128

14: invokestatic #49; //Method java/lang/eOf:(I)Ljava/lang/In

teger;

17: astore_2

18: getstatic #53; //Field java/lang/:Ljava/io/PrintStream;

21: new #59; //class java/lang/StringBuilder

24: dup

25: ldc #82; //String m12 result

27: invokespecial #63; //Method java/lang/StringBuilder."<init>":(Ljava/la

ng/String;)V

30: aload_1

31: aload_2

32: if_acmpne 39

35: iconst_1

36: goto 40

39: iconst_0

40: invokevirtual #66; //Method java/lang/nd:(Z)Ljava/la

ng/StringBuilder;

43: invokevirtual #70; //Method java/lang/ring:()Ljava/l

ang/String;

46: invokevirtual #74; //Method java/io/tln:(Ljava/lang/St

ring;)V

49: return

</init></init></init></init>

  m2

public class DataType {

public static void main(String args[]) {

DataType dt = new DataType();

dt.m21();

dt.m22();

}

public void m21() {

Integer a = new Integer(100);

Integer b = new Integer(100);

tln("m21 result " + (a == b));

}

public void m22() {

Integer a = new Integer(128);

Integer b = new Integer(128);

tln("m22 result " + (a == b));

}

}

打印結果是

m21 result false

m22 result false

a和b仍是兩個對象

javap解析內容

public void m21();

Code:

0: new #44; //class java/lang/Integer

3: dup

4: bipush 100

6: invokespecial #46; //Method java/lang/Integer."<init>":(I)V

9: astore_1

10: new #44; //class java/lang/Integer

13: dup

14: bipush 100

16: invokespecial #46; //Method java/lang/Integer."<init>":(I)V

19: astore_2

20: getstatic #53; //Field java/lang/:Ljava/io/PrintStream;

23: new #59; //class java/lang/StringBuilder

26: dup

27: ldc #84; //String m21 result

29: invokespecial #63; //Method java/lang/StringBuilder."<init>":(Ljava/la

ng/String;)V

32: aload_1

33: aload_2

34: if_acmpne 41

37: iconst_1

38: goto 42

41: iconst_0

42: invokevirtual #66; //Method java/lang/nd:(Z)Ljava/la

ng/StringBuilder;

45: invokevirtual #70; //Method java/lang/ring:()Ljava/l

ang/String;

48: invokevirtual #74; //Method java/io/tln:(Ljava/lang/St

ring;)V

51: return

public void m22();

Code:

0: new #44; //class java/lang/Integer

3: dup

4: sipush 128

7: invokespecial #46; //Method java/lang/Integer."<init>":(I)V

10: astore_1

11: new #44; //class java/lang/Integer

14: dup

15: sipush 128

18: invokespecial #46; //Method java/lang/Integer."<init>":(I)V

21: astore_2

22: getstatic #53; //Field java/lang/:Ljava/io/PrintStream;

25: new #59; //class java/lang/StringBuilder

28: dup

29: ldc #86; //String m22 result

31: invokespecial #63; //Method java/lang/StringBuilder."<init>":(Ljava/la

ng/String;)V

34: aload_1

35: aload_2

36: if_acmpne 43

39: iconst_1

40: goto 44

43: iconst_0

44: invokevirtual #66; //Method java/lang/nd:(Z)Ljava/la

ng/StringBuilder;

47: invokevirtual #70; //Method java/lang/ring:()Ljava/l

ang/String;

50: invokevirtual #74; //Method java/io/tln:(Ljava/lang/St

ring;)V

53: return

m3

public class DataType {

public static void main(String args[]) {

DataType dt = new DataType();

dt.m31();

dt.m32();

}

public void m31() {

Integer a = 100;

Integer b = 100;

tln("m31 result " + (a == b));

}

public void m32() {

Integer a = 128;

Integer b = 128;

tln("m32 result " + (a == b));

}

}

  打印結果

m31 result true

m32 result false