请解释以下情况:
double d3=(double) 1;
Double d4=new Double(1);
System.out.println(d4==d3); // true
System.out.println(d4.equals(d3)) // true
Run Code Online (Sandbox Code Playgroud)
为什么这两个打印true?
如果等于运算符的操作数都是数字类型,或者一个是数字类型而另一个是可转换的(第5.1.8节)为数字类型,则对操作数执行二进制数字提升(第5.6.2节).
请注意,二进制数字提升执行值集转换(第5.1.13节),并可执行拆箱转换(第5.1.8节).
d4取消装箱转换正是这里发生的事情:取消装箱到它的值,1.0然后将其d3与值相比较,这也是1.0.
从你的问题来看,似乎你期待d3 == d4的是false因为它们是不同的"参考"; 但是,原始类型永远不能作为引用,因此任何与基本类型相等的比较都需要转换为该基本类型.我们可以从15.21.3中关于对象相等性的JLS规则中看到这一点:
如果等于运算符的操作数既是引用类型又是null类型,则操作是对象相等.
这是发生对象相等的唯一情况,它不包括基本类型.