下面爲第14行到26行的字節碼編譯文件,可以看到虛擬機是如何自動裝箱和拆箱的,末尾會給出輸出答案
L1
LINENUMBER 14 L1
ICONST_1
INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;
ASTORE 2 //存入ICONST_1+Integer裝箱
L2
LINENUMBER 15 L2
ICONST_2
INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;
ASTORE 3 //存入ICONST_2+Integer裝箱
L3
LINENUMBER 16 L3
ICONST_3
INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;
ASTORE 4 //存入ICONST_3+Integer裝箱
L4
LINENUMBER 17 L4
ICONST_3
INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;
ASTORE 5 //存入ICONST_3+Integer裝箱
L5
LINENUMBER 18 L5
SIPUSH 321
INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;
ASTORE 6 //存入321+Integer裝箱
L6
LINENUMBER 19 L6
SIPUSH 321
INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;
ASTORE 7 //存入321+Integer裝箱
L7
LINENUMBER 20 L7
LDC 3
INVOKESTATIC java/lang/Long.valueOf (J)Ljava/lang/Long;
ASTORE 8 //存入3+Long裝箱
L8
LINENUMBER 21 L8
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
ALOAD 4
ALOAD 5 //這裏的4和5都是
IF_ACMPNE L9
ICONST_1
GOTO L10
L9
FRAME FULL [[Ljava/lang/String; java/util/List java/lang/Integer java/lang/Integer java/lang/Integer java/lang/Integer java/lang/Integer java/lang/Integer java/lang/Long] [java/io/PrintStream]
ICONST_0
L10
FRAME FULL [[Ljava/lang/String; java/util/List java/lang/Integer java/lang/Integer java/lang/Integer java/lang/Integer java/lang/Integer java/lang/Integer java/lang/Long] [java/io/PrintStream I]
INVOKEVIRTUAL java/io/PrintStream.println (Z)V
L11
LINENUMBER 22 L11
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
ALOAD 6
ALOAD 7
IF_ACMPNE L12 //不涉及算術運算比較對象
ICONST_1
GOTO L13
L12
FRAME SAME1 java/io/PrintStream
ICONST_0
L13
FRAME FULL [[Ljava/lang/String; java/util/List java/lang/Integer java/lang/Integer java/lang/Integer java/lang/Integer java/lang/Integer java/lang/Integer java/lang/Long] [java/io/PrintStream I]
INVOKEVIRTUAL java/io/PrintStream.println (Z)V
L14
LINENUMBER 23 L14 //涉及算數運算IADD的時候回自動拆箱比較數值
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
ALOAD 4
INVOKEVIRTUAL java/lang/Integer.intValue ()I //拆箱
ALOAD 2
INVOKEVIRTUAL java/lang/Integer.intValue ()I //拆箱
ALOAD 3
INVOKEVIRTUAL java/lang/Integer.intValue ()I //拆箱
IADD
IF_ICMPNE L15 //比較int
ICONST_1
GOTO L16
L15
FRAME SAME1 java/io/PrintStream
ICONST_0
L16
FRAME FULL [[Ljava/lang/String; java/util/List java/lang/Integer java/lang/Integer java/lang/Integer java/lang/Integer java/lang/Integer java/lang/Integer java/lang/Long] [java/io/PrintStream I]
INVOKEVIRTUAL java/io/PrintStream.println (Z)V
L17
LINENUMBER 24 L17
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
ALOAD 4
ALOAD 2
INVOKEVIRTUAL java/lang/Integer.intValue ()I //拆箱
ALOAD 3
INVOKEVIRTUAL java/lang/Integer.intValue ()I //拆箱
IADD //算術IADD
INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;//拆完了裝箱
INVOKEVIRTUAL java/lang/Integer.equals (Ljava/lang/Object;)Z//比較對象
INVOKEVIRTUAL java/io/PrintStream.println (Z)V
L18
LINENUMBER 25 L18 //涉及算數運算IADD的時候回自動拆箱比較數值
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
ALOAD 8
INVOKEVIRTUAL java/lang/Long.longValue ()J
ALOAD 2
INVOKEVIRTUAL java/lang/Integer.intValue ()I
ALOAD 3
INVOKEVIRTUAL java/lang/Integer.intValue ()I
IADD
I2L
LCMP
IFNE L19
ICONST_1
GOTO L20
L19
FRAME SAME1 java/io/PrintStream
ICONST_0
L20
FRAME FULL [[Ljava/lang/String; java/util/List java/lang/Integer java/lang/Integer java/lang/Integer java/lang/Integer java/lang/Integer java/lang/Integer java/lang/Long] [java/io/PrintStream I]
INVOKEVIRTUAL java/io/PrintStream.println (Z)V
L21
LINENUMBER 26 L21 //Long.equals (Object) instanceof檢查不通過
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
ALOAD 8
ALOAD 2
INVOKEVIRTUAL java/lang/Integer.intValue ()I
ALOAD 3
INVOKEVIRTUAL java/lang/Integer.intValue ()I
IADD
INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;
INVOKEVIRTUAL java/lang/Long.equals (Ljava/lang/Object;)Z
INVOKEVIRTUAL java/io/PrintStream.println (Z)V
L22
LINENUMBER 27 L22
RETURN
L23
LOCALVARIABLE args [Ljava/lang/String; L0 L23 0
LOCALVARIABLE list Ljava/util/List; L1 L23 1
// signature Ljava/util/List<Ljava/lang/Integer;>;
// declaration: list extends java.util.List<java.lang.Integer>
LOCALVARIABLE a Ljava/lang/Integer; L2 L23 2
LOCALVARIABLE b Ljava/lang/Integer; L3 L23 3
LOCALVARIABLE c Ljava/lang/Integer; L4 L23 4
LOCALVARIABLE d Ljava/lang/Integer; L5 L23 5
LOCALVARIABLE e Ljava/lang/Integer; L6 L23 6
LOCALVARIABLE f Ljava/lang/Integer; L7 L23 7
LOCALVARIABLE g Ljava/lang/Long; L8 L23 8
MAXSTACK = 5
MAXLOCALS = 9
}
輸出:
true
false
true
true
true
false