Java 原语==包装转换为原语==原语或包装==包装?
我假设jls中描述的转换是按照优先级排序的。 第一优先 因此,我解决了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
装箱
比拆箱
优先级更高的问题。我决定核实这个假设
研究以下代码:
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);