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