Integer什么时候会触发自动拆装箱

1.基础面试题里碰到过这样的操作:

Integer什么时候会触发自动拆装箱

运行结果确是:

Integer什么时候会触发自动拆装箱

第一个规则就是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