请解释以下情况:
double d3=(double) 1;
Double d4=new Double(1);
System.out.println(d4==d3); // true
System.out.println(d4.equals(d3)) // true
为什么这两个都打印true
?
答案 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,所以它们被认为是相等的。