Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么双精度“==”和“等于”等于双精度?_Java_Equality - Fatal编程技术网

Java 为什么双精度“==”和“等于”等于双精度?

Java 为什么双精度“==”和“等于”等于双精度?,java,equality,Java,Equality,请说明以下情况: double d3=(double) 1; Double d4=new Double(1); System.out.println(d4==d3); // true System.out.println(d4.equals(d3)) // true 为什么这两种打印都是真的?double是一种基本类型,而double是一个类,充当double的包装器。这就是为什么,例如,如果您尝试使用d3.equal作为一种方便,您会得到一个错误,这两个值之间的比较正如您所期望的那样,只考虑

请说明以下情况:

double d3=(double) 1;
Double d4=new Double(1);
System.out.println(d4==d3); // true
System.out.println(d4.equals(d3)) // true
为什么这两种打印都是真的?

double是一种基本类型,而double是一个类,充当double的包装器。这就是为什么,例如,如果您尝试使用d3.equal作为一种方便,您会得到一个错误,这两个值之间的比较正如您所期望的那样,只考虑它们的数值;在这种情况下,由于它们都是1,因此它们被视为相等。

来自:

如果相等运算符的操作数都是数字类型,或者一个是数字类型,而另一个可转换为数字类型§5.1.8,则对操作数§5.6.2执行二进制数字提升

请注意,二进制数字升级执行§5.1.13中的值集转换,并可能执行§5.1.8中的解装箱转换

拆箱转换正是这里发生的事情:d4被拆箱到它的值1.0,然后与d3的值进行比较,d3的值也是1.0

从您的问题来看,似乎您希望d3==d4为假,因为它们是不同的引用;但是,基元类型永远不能是引用,因此任何与基元类型相等的比较都需要转换为该基元类型。我们可以从以下方面看到这一点:

如果相等运算符的操作数都是引用类型或null类型,则该操作为对象相等


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

这有什么奇怪的?你需要问更具体的问题,而不是为什么会这样?你需要了解一下。@VD'在Java中很奇怪,因为它是特殊的大小写魔法。。谢谢。这对我很有帮助。请给我解释一下两种表达的机制。双d3=双1;double d4=新的double 1@勒曲ố我不知道你的意思-请随意创建一个新问题并从这里链接到它。