[英]Difference between double and Double in comparison
我知道Double
是一个包装类,它包装double
数。 今天,我看到了另一个主要区别:
double a = 1.0;
double b = 1.0;
Double c = 1.0;
Double d = 1.0;
System.out.println(a == b); // true
System.out.println(c == d); // false
对我来说太奇怪了!!!
所以,如果我们使用Double
,每次都必须这样做:
private static final double delta = 0.0001;
System.out.println(Math.abs(c-d) < delta);
我无法解释为什么 Double 直接比较是错误的。 请为我解释。
c
和d
在技术上是两个不同的对象,而==
运算符只比较引用。
c.equals(d)
更好,因为它比较值,而不是参考。 但还是不理想。 直接比较浮点值应始终考虑一些错误(epsilon)( Math.abs(c - d) < epsilon
)。
注意:
Integer c = 1;
Integer d = 1;
这里比较会产生true
,但这更复杂( Integer
内部缓存,在Integer.valueOf()
JavaDoc中描述):
此方法将始终缓存 -128 到 127(含)范围内的值,并且可能缓存此范围之外的其他值。
为什么是valueOf()
? 因为这个方法隐式用于实现自动装箱:
Integer c = Integer.valueOf(1);
Integer d = Integer.valueOf(1);
当应用于类类型的表达式时, ==
将始终执行引用比较( JLS 第 15.21.3 节)。 所以这一行:
System.out.println(c == d);
正在检查c
和d
是否引用相同的对象。 Java 中的自动装箱总是(我相信)为float
和double
创建一个新对象(整数类型1的情况更复杂)。 因此c
和d
指的是不同的对象,因此它打印false
。
如果要比较对象是否相等,则需要显式调用equals
:
System.out.println(c.equals(d));
对于double
,它使用数字相等代替 - 如第 15.21.1 节中所述。 因此,行为上的差异。
1对于完整的自动装箱,“小”值被缓存 - 所以自动装箱 5(比如说)每次都会返回相同的引用。 “小”的定义是特定于实现的,但保证在 -128 到 127 的范围内。有关详细信息,请参阅第 5.1.7 节的底部。
使用equals()
检查 2 个对象的相等性。 ==
检查 2 个引用是否指向内存中的同一个对象。
检查原始类型时,内容检查仅对==
可靠。 对于对象类型,最好使用equals
方法:
c.equals(d)
==
和equals
区别
在原始数据类型上使用==
与在对象引用数据类型上使用它不同。
==
用作equals
。==
指的是它们的引用。 因此对象指向内存中的内容。考虑案例 1
double d1 = 10.00;
double d2 =10.00;
System.out.println(d1 == d2);
*输出是* true
情况 2: ==
引用数据类型
Double d1 = 10.00;
Double d2 =10.00;
System.out.println(d1 == d2);
*输出是* false
d1 和 d2 具有不同的内存引用。
要检查它的有效性,请考虑以下代码
Double d1 = 10.00;
Double d2 = d1;
System.out.println(d1 == d2);
这将打印true
因为 d1 和 d2 指向相同的内存引用。
所以
Java
使用==
来比较原语并检查两个变量是否指向同一个对象
‘等于’
用于检查两个objects
是否相等。
它还取决于它被调用的对象的实现。 对于Strings
, equals()
检查其中的字符。
Double d1 = 10.00;
Double d2 = 10.00;
System.out.println(d1.equals(d2));
打印为true
因为它查看 d1 和 d2 中的内容。
情况 1不会编译
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.