primitive == Wrapper转换为primitive == primitive或Wrapper == Wrapper?

时间:2014-04-08 11:41:46

标签: java equals numeric boxing unboxing

我认为jls中描述的转换是根据优先级排序的。 首先要优先考虑。

jls

因此,我解决了Boxing的优先级高于Unboxing的问题。我决定检查这个假设。

研究以下代码:

public class BoxingUnboxingPriority {
    public static void main(String [] args){
        int sn = 1000;
        Integer isn1= new Integer(sn);
        System.out.println(sn == isn1 );

    }
}

出:

true

什么是拳击?只是new Integer(primitiveInt)

我稍微更改了代码

int sn = 1000;
Integer isn1= new Integer(sn);
Integer isn2= new Integer(sn);
System.out.println(isn1 == isn2 );

out:

false

因此我犯了错误。

请澄清这个问题。

4 个答案:

答案 0 :(得分:2)

relevant section

  

<强> 15.21.1。数值等式算子==和!=

     

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

所以:

Integer o = 1;
int i = 1;
boolean b = o == i;

......相当于:

boolean b = o.intValue() == i;

如果两者都是 Integer 类型,则它们都不是原始数字类型 - 它们都是§5.6.2

答案 1 :(得分:1)

当您使用包含Wrapper对象的基元时,该包装器对象将被取消装箱,然后将应用该操作。

在第一种情况下,当您将snisn1进行比较时,isn1将被取消装箱,并且会比较该值。所以你得到true

在第二种情况下,isn1isn2是两个不同的对象,因此==运算符将提供false

答案 2 :(得分:0)

  

我认为jls中描述的转换是根据优先级进行排序的。

这是不正确的。 JLS没有谈及&#34;优先事项&#34;转换。这不是一个公认的概念。

事实上,可以应用的转换是根据每个运营商的具体情况记录的,依此类推。因此,JLS 15.21.1表示数字类型的==!=会导致&#34;二进制数字促销&#34;两个操作数。 JLS 5.6.2表示二进制数字促销包含&#34;拆箱转换&#34; (5.1.8)后跟&#34;扩大原始转换&#34; (5.1.2),最后&#34;价值集转换&#34; (5.1.3)。

相比之下,JLS 15.21.3表示使用==!=比较两个引用时,不会进行任何促销或转化。

(事实上,一个常见的Java初学者错误就是使用==来比较两个Integer对象而不是equals(Object)方法。可能这就是&#34;问题& #34;你正在试图测试你对...的理解。)

答案 3 :(得分:0)

int sn=1000; Integer isn1=new Integer(sn); System.out.println(sn == isn1 );

将转换为

System.out.println(sn == isn1.intValue());

在将原语与包装器进行比较时,首先将包装器对象取消装箱然后进行比较。 包装器对象intValue()返回int,因为原始比较结果为true。

Integer isn1= new Integer(sn);

Integer isn2= new Integer(sn); System.out.println(isn1 == isn2 );

//将两个不同的对象比较为假。