2014-09-25 102 views
-3

请说明以下情况:为什么双倍“==”和“等于”双倍?

double d3=(double) 1; 
Double d4=new Double(1); 
System.out.println(d4==d3); // true 
System.out.println(d4.equals(d3)) // true 

为什么这两个打印true的?

+2

这有什么奇怪的? – 2014-09-25 03:03:20

+0

你需要提出更具体的问题,而不是“为什么这样?” – 2014-09-25 03:04:08

+2

您需要阅读[autoboxing](http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html)。 – azurefrog 2014-09-25 03:06:15

回答

5

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 == d4false,因为它们是不同的“参考”;然而,基本类型永远不能作为引用,所以任何与基本类型相等的比较都需要转换为该基本类型。我们可以从the JLS rules regarding object equality in 15.21.3看到:

如果相等运算符的操作数两者都被引用类型或空类型,那么操作对象相等。

这是发生对象平等的唯一情况,它不包含基元类型。

+0

谢谢。它有助于me.in addion。请详细说明两个表达的机制。 Double d3 =(double)1; \t \t double d4 = new Double(1); – 2014-09-25 03:26:51

+0

@LêQuốcÂn我不确定你的意思 - 随时创建一个新的问题,并从这里链接到它。 – 2014-09-25 03:32:46

1

double是基本类型,而Double是充当包装一个double周围的类。 (这就是为什么,例如,如果你试图使用d3.equal,你会得到一个错误)为了方便起见,比较两个工作,就像你期待的那样,只是考虑它们的数值;在这种情况下,因为它们都是1,所以它们被认为是相等的。