【问题标题】:When using == for a primitive and a boxed value, is autoboxing done, or is unboxing done当对原始值和装箱值使用 == 时,自动装箱完成还是拆箱完成
【发布时间】:2015-05-26 09:26:51
【问题描述】:

以下代码编译(使用 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 的原因,也是我特别询问拆箱/装箱而不是比较结果的原因。

【问题讨论】:

  • 当然,如果您运行此代码并打印输出,您可以自己确定。
  • 该问题与用于将其标记为重复的问题不完全相同:)
  • @Scruffy - 没那么简单。 Integer 类维护-128 to 127 之间的值的内部缓存。因此,即使您使用 ==Integer i1=100Integer i2=100 进行比较,您也会得到 true。当i1i2 不在该本地缓存范围内时,您将获得false
  • @TheLostMind,说得好。这就是我选择 1000 作为示例的原因,我将把它添加到问题中。

标签: java autoboxing


【解决方案1】:

定义在JLS #15.21.1:

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

还有JLS #5.6.2:

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

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

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

【讨论】:

    【解决方案2】:

    让我们做一些例子:

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

    【讨论】:

      【解决方案3】:

      说明

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

      2. 当使用 == 运算符比较两个对象时,自动装箱播放 角色。

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

      请通过下面的链接,通过合适的示例帮助您了解有关自动装箱的详细信息。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-15
        • 2011-12-25
        • 2011-02-28
        相关资源
        最近更新 更多