为什么是双重" =="和#34;等于"到双人间?

时间:2014-09-25 02:59:38

标签: java equality

请解释以下情况:

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

为什么这两个都打印true

2 个答案:

答案 0 :(得分: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 == d4成为false,因为它们是不同的“引用”;但是,原始类型永远不能作为引用,因此任何与基本类型相等的比较都需要转换为该基本类型。我们可以从the JLS rules regarding object equality in 15.21.3

看到这一点
  

如果等于运算符的操作数既是引用类型又是null类型,则操作是对象相等。

这是发生对象相等的唯一情况,它不包括基本类型。

答案 1 :(得分:1)

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