当我们添加两个Integer对象时,内部的操作



有人能解释一下在java中添加两个Integer对象时的内部行为吗?(就像它是将对象开箱到基元中,然后添加两个整数,最后将其装箱到Integer对象中一样)

Integer sum = new Integer(2) + new Integer(4); 

它被编译成这样:

Integer sum = Integer.valueOf(new Integer(2).intValue()+new Integer(4).intValue());

您可以通过查看使用javap -c获得的字节码反汇编来验证这一点。

这是对应于新Integer(2).intValue()的部分,在堆栈上留下int 2:

0:  new #2; //class java/lang/Integer
3:  dup
4:  iconst_2
5:  invokespecial   #3; //Method java/lang/Integer."<init>":(I)V
8:  invokevirtual   #4; //Method java/lang/Integer.intValue:()I

这是对应于新Integer(4).intValue()的部分,在堆栈上留下int 4:

11: new #2; //class java/lang/Integer
14: dup
15: iconst_4
16: invokespecial   #3; //Method java/lang/Integer."<init>":(I)V
19: invokevirtual   #4; //Method java/lang/Integer.intValue:()I

这里,总和2+4是用iadd计算的,通过调用Integer.valueOf将总和装箱为Integer,结果存储在第一个局部变量(astore_1)中:

22: iadd
23: invokestatic    #5; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
26: astore_1

创建两个Integer实例。

自动取消装箱这两个实例。

保存结果的新CCD_ 6。

将结果自动装箱到Integer sum实例中。

最新更新