java语言 百分网手机站

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

时间:2020-08-08 14:39:06 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."<init>":(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."<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/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."<init>":(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."<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/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

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

  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."<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/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."<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/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."<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/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."<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/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