当使用 = = 表示原语和装箱值时,是自动装箱还是拆箱

编译以下代码(使用 Java8) :

Integer i1 = 1000;
int i2 = 1000;
boolean compared = (i1 == i2);

但是它能做什么呢?

拆箱 i1:

boolean compared = (i1.intvalue() == i2);

或方格 i2:

boolean compared = (i1 == new Integer(i2));

那么它是比较两个 Integer对象(通过引用)还是两个 int变量通过值?

注意,对于某些数字,引用比较将产生正确的结果,因为 Integer 类在 -128127之间维护一个值的内部缓存(另请参阅 TheLostMind 的注释)。这就是我在示例中使用 1000的原因,也是我专门询问取消装箱/装箱而不是比较结果的原因。

12989 次浏览

让我们举几个例子:

案例 -1:

       public static void main(String[] args) {
Integer i1 = 1000;
int i2 = 1000;
boolean compared = (i1 == i2);
System.out.println(compared);
}

字节码:

....
16: if_icmpne     23 // comparing 2 integers
....

案例 -2:

public static void main(String[] args) {
Integer i1 = 1000;
Integer i2 = 1000;
//int i2 = 1000;
boolean compared = (i1 == i2);
System.out.println(compared);
}

字节码:

...
16: if_acmpne     23 // comparing references
....

因此,在比较 Integerint==的情况下,Integer被解封为 int,然后进行比较。

在比较2个 Integers的情况下,对2个 Integers的参考文献进行了比较。

JLS # 15.21.1对此作了定义:

如果相等运算符的操作数都是数值类型,或者一个是数值类型,另一个可转换(5.1.8)为数值类型,则对操作数执行二进制数值提升(5.6.2)。

还有 JLS # 5.6.2:

当一个运算符对一对操作数应用二进制数字提升时,其中每个操作数必须表示一个可转换为数字类型的值,按顺序应用以下规则:

  • 如果任何操作数属于引用类型,则将对其进行拆箱转换 [...]

所以为了回答你的问题 Integer被拆封成了 int

解释

  1. 当使用 = = 运算符自动装箱比较两个基元值时 不会发生

  2. 当使用 = = 操作符自动装箱比较两个对象时 角色

  3. 当使用混合组合时,它包含一个 Object 和 基元类型和比较是使用 = = 运算符拆箱完成的 并转换为基元类型。

请通过下面的链接,这将有助于您了解详细的自动装箱与适当的例子。

参考链接: http://javarevisited.blogspot.in/2012/07/auto-boxing-and-unboxing-in-java-be.html