我知道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直接比较错误。请解释一下。
谢谢:)
答案 0 :(得分:24)
c
和d
在技术上是两个不同的对象,==
运算符仅比较引用。
c.equals(d)
更好,因为它比较值而不是引用。但仍然不理想。直接比较浮点值应始终考虑一些错误(epsilon)(Math.abs(c - d) < epsilon
)。
请注意:
Integer c = 1;
Integer d = 1;
此处比较会产生true
,但这更复杂(Integer
内部缓存,在JavaDoc of Integer.valueOf()
中描述):
此方法将始终缓存-128到127(包括端点)范围内的值,并可以缓存此范围之外的其他值。
为什么valueOf()
?因为此方法隐式用于实现自动装箱:
Integer c = Integer.valueOf(1);
Integer d = Integer.valueOf(1);
答案 1 :(得分:4)
当应用于类类型的表达式时,==
将始终执行参考比较(JLS section 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
,它使用数字相等 - 如section 15.21.1中所指定。因此行为上的差异。
1 对于整体自动装箱,“小”值被缓存 - 因此自动装箱5(比如说)每次都会返回相同的参考值。 “小”的定义是特定于实现的,但它保证在-128到127的范围内。有关详细信息,请参阅section 5.1.7的底部。
答案 2 :(得分:3)
使用equals()
检查2个对象的相等性。 ==
检查2个引用是否引用内存中的同一对象。
答案 3 :(得分:2)
内容检查仅在检查基元类型时==
可靠。对于对象类型,最好使用equals
方法:
c.equals(d)
答案 4 :(得分:0)
==
和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);
由于d1和d2指向相同的内存引用,因此将打印true
。
因此
Java
使用==
比较基元,并检查两个变量是否引用相同的 object < / p>
“等于”
用于检查两个objects
是否等效。
它还取决于被调用对象的实现。对于Strings
,equals()
检查其中的字符。
Double d1 = 10.00;
Double d2 = 10.00;
System.out.println(d1.equals(d2));
打印true
,因为它看起来在d1和d2内部。
情况1 将不会编译