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

时间:2015-05-26 09:26:52

标签: java autoboxing

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

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以及为什么我特别询问拆箱/装箱而不是比较的结果。

3 个答案:

答案 0 :(得分:48)

它在JLS #15.21.1

中定义
  

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

JLS #5.6.2

  

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

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

为了回答您的问题,Integer已取消装箱到int

答案 1 :(得分:35)

让我们举一些例子:

案例-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的引用。

答案 2 :(得分:1)

<强>解释

  1. 使用== operator autoboxing比较两个原始值时 不会发生。

  2. 使用== operator autoboxing播放比较两个对象时 作用。

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

  4. 请仔细阅读以下链接,以便通过合适的示例了解有关自动装箱的详细信息。

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