当使用==表示基元和盒装值时,自动装箱完成,或者取消装箱完成

Thi*_*ler 53 java autoboxing

以下代码编译(使用Java 8):

Integer i1 = 1000;
int i2 = 1000;
boolean compared = (i1 == i2);
Run Code Online (Sandbox Code Playgroud)

但是它做了什么?

取消框i1:

boolean compared = (i1.intvalue() == i2);
Run Code Online (Sandbox Code Playgroud)

或盒子i2:

boolean compared = (i1 == new Integer(i2));
Run Code Online (Sandbox Code Playgroud)

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

请注意,对于某些数字,因为Integer类维护值之间的内部缓存中的基准比较将产生正确的结果-128127(见也TheLostMind注释).这就是我1000在我的例子中使用的原因以及为什么我特别询问拆箱/装箱而不是比较的结果.

ass*_*ias 51

它在JLS#15.21.1中定义:

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

JLS#5.6.2:

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

  • 如果任何操作数是引用类型,则进行拆箱转换[...]

所以要回答你的问题,将Integer其拆箱成一个int.


The*_*ind 37

让我们举一些例子:

情况1 :

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

字节代码:

....
        16: if_icmpne     23 // comparing 2 integers
....
Run Code Online (Sandbox Code Playgroud)

案例-2:

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

字节码:

...
     16: if_acmpne     23 // comparing references
....
Run Code Online (Sandbox Code Playgroud)

因此,如果比较Integer和将int==Integer未装箱进行int比较,则会发生比较.

在比较2的情况下,比较2 Integers的参考Integers.


kar*_*hah 5

解释

  1. 当使用 == 运算符比较两个原始值时,不会发生自动装箱。

  2. 当使用 == 运算符比较两个对象时,自动装箱发挥作用。

  3. 当使用混合组合时,它包含一个对象和原始类型,并使用 == 运算符进行比较,在对象上发生拆箱并转换为原始类型。

请浏览以下链接,它将帮助您通过合适的示例详细了解自动装箱。

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