荟萃馆

位置:首页 > 计算机 > java语言

Java装箱与拆箱详解(附实例代码)

java语言5.65K

本文是本站小编搜索整理的主要介绍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