Java 原语==包装转换为原语==原语或包装==包装?

Java 原语==包装转换为原语==原语或包装==包装?,java,equals,numeric,boxing,unboxing,Java,Equals,Numeric,Boxing,Unboxing,我假设jls中描述的转换是按照优先级排序的。 第一优先 因此,我解决了装箱比拆箱优先级更高的问题。我决定核实这个假设 研究以下代码: public class BoxingUnboxingPriority { public static void main(String [] args){ int sn = 1000; Integer isn1= new Integer(sn); System.out.println(sn == isn1

我假设jls中描述的转换是按照优先级排序的。 第一优先

因此,我解决了
装箱
拆箱
优先级更高的问题。我决定核实这个假设

研究以下代码:

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

    }
}
out:

true
什么是拳击?只是
新的整数(primitiveInt)

我稍微修改了一下代码

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

false

因此我犯了错误


请澄清这个问题。

当您将原语与包装器对象一起使用时,将取消包装器对象,然后应用该操作

在第一种情况下,当您将
sn
isn1
进行比较时,
isn1
将被取消绑定,并将比较该值。所以你得到了
true

在第二种情况下,
isn1
isn2
是两个不同的对象,因此
==
运算符将给出
false

15.21.1。数值相等运算符==和=

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

因此:

…相当于:

boolean b = o.intValue() == i;
如果两者都是整数类型,则两者都不是基元数字类型-它们都是

我假设jls中描述的转换是按照优先级排序的

这是不正确的。JLS没有讨论转换的“优先级”。这不是一个公认的概念

事实上,可以应用的转换是根据每个操作符的具体情况记录的,依此类推。因此说
==
=会导致两个操作数的“二进制数值提升”。并表示二进制数字升级包括“取消装箱转换”(unboxing conversion),然后是“扩大原语转换”(wilding primitive conversion),最后是“值集转换”(value set conversion)

相比之下,表示当使用
==
比较两个引用时=,未进行任何促销或转换

(事实上,Java初学者的一个常见错误是使用
=
来比较两个
Integer
对象,而不是
equals(Object)
方法; 整数isn1=新整数(sn); System.out.println(sn==isn1)

将转换为

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

在将原语与包装器进行比较时,包装器对象将首先解除绑定,然后进行比较。 包装器对象intValue()返回int so,因为原语比较结果为true

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


//比较两个不同的对象是错误的。

使用
.equals
而不是
=
来比较对象
=
检查它们是否是相同的对象,而不是您使用
new
创建它们时使用的对象
.equals
将返回
true
,因为它们代表相同的数字。@Andremoniyааааажжжажжажжаа1072@乔克:这是我的问题test@gstackoverflow因此,jls中描述的转换是根据优先级排序的。本条款是错误的吗?不,第二种情况与装箱/拆箱无关,它只是两种情况的参考等式objects@OlegEstekhin字体我从不说,它有装箱/拆箱功能。什么是数字类型?
Integer isn1= new Integer(sn);