为什么双倍“==”和“等于”双倍?
请说明以下情况:为什么双倍“==”和“等于”双倍?
double d3=(double) 1;
Double d4=new Double(1);
System.out.println(d4==d3); // true
System.out.println(d4.equals(d3)) // true
为什么这两个打印true
的?
从Java Language Specification 15.21.1:
如果相等运算符的操作数都是数字型的,或一个是数字型的,另一种是可兑换(§5.1.8),以数字类型,二进制数字对操作数进行提升(第5.6.2节)。
请注意,二进制数值提升执行值集转换(第5.1.13节)并可能执行拆箱转换(第5.1.8节)。
拆箱转换正是这里发生了什么:d4
是拆箱到它的价值,1.0
,然后比较d3
的价值,这也是1.0
。
从你的问题,你似乎期待d3 == d4
是false
,因为它们是不同的“参考”;然而,基本类型永远不能作为引用,所以任何与基本类型相等的比较都需要转换为该基本类型。我们可以从the JLS rules regarding object equality in 15.21.3看到:
如果相等运算符的操作数两者都被引用类型或空类型,那么操作对象相等。
这是发生对象平等的唯一情况,它不包含基元类型。
谢谢。它有助于me.in addion。请详细说明两个表达的机制。 Double d3 =(double)1; \t \t double d4 = new Double(1); – 2014-09-25 03:26:51
@LêQuốcÂn我不确定你的意思 - 随时创建一个新的问题,并从这里链接到它。 – 2014-09-25 03:32:46
double
是基本类型,而Double
是充当包装一个double
周围的类。 (这就是为什么,例如,如果你试图使用d3.equal
,你会得到一个错误)为了方便起见,比较两个工作,就像你期待的那样,只是考虑它们的数值;在这种情况下,因为它们都是1,所以它们被认为是相等的。
这有什么奇怪的? – 2014-09-25 03:03:20
你需要提出更具体的问题,而不是“为什么这样?” – 2014-09-25 03:04:08
您需要阅读[autoboxing](http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html)。 – azurefrog 2014-09-25 03:06:15