java装箱_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;

System.out.println("m11 result " + (a == b));

}

public void m12() {

Integer a = new Integer(128);

Integer b = 128;

System.out.println("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."":(I)V

9:  astore_1

10: bipush 100

12: invokestatic  #49; //Method java/lang/Integer.valueOf:(I)Ljava/lang/In

teger;

15: astore_2

16: getstatic    #53; //Field java/lang/System.out: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."":(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/StringBuilder.append:(Z)Ljava/la

ng/StringBuilder;

41: invokevirtual  #70; //Method java/lang/StringBuilder.toString:()Ljava/l

ang/String;

44: invokevirtual  #74; //Method java/io/PrintStream.println:(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."":(I)V

10: astore_1

11: sipush 128

14: invokestatic  #49; //Method java/lang/Integer.valueOf:(I)Ljava/lang/In

teger;

17: astore_2

18: getstatic    #53; //Field java/lang/System.out: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."":(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/StringBuilder.append:(Z)Ljava/la

ng/StringBuilder;

43: invokevirtual  #70; //Method java/lang/StringBuilder.toString:()Ljava/l

ang/String;

46: invokevirtual  #74; //Method java/io/PrintStream.println:(Ljava/lang/St

ring;)V

49: return

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);

System.out.println("m21 result " + (a == b));

}

public void m22() {

Integer a = new Integer(128);

Integer b = new Integer(128);

System.out.println("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."":(I)V

9:  astore_1

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

13: dup

14: bipush 100

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

19: astore_2

20: getstatic    #53; //Field java/lang/System.out: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."":(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/StringBuilder.append:(Z)Ljava/la

ng/StringBuilder;

45: invokevirtual  #70; //Method java/lang/StringBuilder.toString:()Ljava/l

ang/String;

48: invokevirtual  #74; //Method java/io/PrintStream.println:(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."":(I)V

10: astore_1

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

14: dup

15: sipush 128

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

21: astore_2

22: getstatic    #53; //Field java/lang/System.out: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."":(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/StringBuilder.append:(Z)Ljava/la

ng/StringBuilder;

47: invokevirtual  #70; //Method java/lang/StringBuilder.toString:()Ljava/l

ang/String;

50: invokevirtual  #74; //Method java/io/PrintStream.println:(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;

System.out.println("m31 result " + (a == b));

}

public void m32() {

Integer a = 128;

Integer b = 128;

System.out.println("m32 result " + (a == b));

}

}

打印结果

m31 result true

m32 result false

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值