Integer什么时候会触发自动拆装箱
1.基础面试题里碰到过这样的操作:
运行结果确是:
第一个规则就是Integer value = xx,赋值操作,是调用Integer.valueOf进行装箱操作,变成Integer对象的
所以第一个false很容易理解,因为Integer的cahe是在-128~127之间的。
第二个false是因为a4 = a1 + a2时,涉及Integer对象间的基本加减乘除操作时是需要拆装成基本类型计算后,然后再装箱的,所以这里比较两个不同的integer对象,所以这里还是false
第三个为true的原因,其实第二个已经说明了一半,因为a1 + a2是要进行拆装计算的,此时,a1+ a2是一个基本类型int,然后继续跟a3比较的时候,这里a3进行了拆装操作,所以就都变成了基本类型的值比较,所以结果就成了true.这里可以查看下图的字节码71-81行
以上说明都是针对jdk的字节码说明的:
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
Code:
stack=3, locals=5, args_size=1
0: sipush 128
3: invokestatic #12 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
6: astore_1
7: sipush 128
10: invokestatic #12 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
13: astore_2
14: sipush 256
17: invokestatic #12 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
20: astore_3
21: aload_1
22: invokevirtual #13 // Method java/lang/Integer.intValue:()I
25: aload_2
26: invokevirtual #13 // Method java/lang/Integer.intValue:()I
29: iadd
30: invokestatic #12 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
33: astore 4
35: getstatic #14 // Field java/lang/System.out:Ljava/io/PrintStream;
38: aload_1
39: aload_2
40: if_acmpne 47
43: iconst_1
44: goto 48
47: iconst_0
48: invokevirtual #15 // Method java/io/PrintStream.println:(Z)V
51: getstatic #14 // Field java/lang/System.out:Ljava/io/PrintStream;
54: aload 4
56: aload_3
57: if_acmpne 64
60: iconst_1
61: goto 65
64: iconst_0
65: invokevirtual #15 // Method java/io/PrintStream.println:(Z)V
68: getstatic #14 // Field java/lang/System.out:Ljava/io/PrintStream;
71: aload_1
72: invokevirtual #13 // Method java/lang/Integer.intValue:()I
75: aload_2
76: invokevirtual #13 // Method java/lang/Integer.intValue:()I
79: iadd
80: aload_3
81: invokevirtual #13 // Method java/lang/Integer.intValue:()I
84: if_icmpne 91
87: iconst_1
88: goto 92
91: iconst_0
92: invokevirtual #15 // Method java/io/PrintStream.println:(Z)V
95: return