25

我知道这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 直接比较是错误的。请为我解释。

4

5 回答 5

33

c并且d在技术上是两个不同的对象,==运算符仅比较引用。

c.equals(d)

更好,因为它比较值,而不是参考。但仍然不理想。直接比较浮点值应始终考虑一些错误(epsilon)(Math.abs(c - d) < epsilon)。

注意:

Integer c = 1;
Integer d = 1;

这里比较会产生true,但这更复杂(Integer内部缓存,在JavaDoc 中Integer.valueOf()描述):

此方法将始终缓存 -128 到 127(含)范围内的值,并且可能缓存此范围之外的其他值。

为什么valueOf()?因为这个方法隐式用于实现自动装箱:

Integer c = Integer.valueOf(1);
Integer d = Integer.valueOf(1);

也可以看看

于 2012-09-01T10:00:04.717 回答
6

当应用于类类型的表达式时,==始终执行引用比较(JLS 第 15.21.3 节)。所以这一行:

System.out.println(c == d); 

正在检查是否cd引用相同的对象。Java中的自动装箱总是(我相信)为floatand创建一个新对象double(对于整数类型来说情况更复杂1)。因此candd引用不同的对象,所以它打印false.

如果要比较对象是否相等,则需要equals显式调用:

System.out.println(c.equals(d));

使用double,它使用数字相等代替 - 如第 15.21.1 节中所述。因此行为上的差异。


1对于积分自动装箱,“小”值被缓存 - 所以自动装箱 5(比如说)每次都会返回相同的引用。“小”的定义是特定于实现的,但它保证在 -128 到 127 的范围内。有关详细信息,请参阅第 5.1.7 节的底部。

于 2012-09-01T10:02:09.813 回答
3

用于equals()检查 2 个对象的相等性。==检查 2 个引用是否引用了内存中的同一个对象。

于 2012-09-01T10:00:48.820 回答
2

内容检查仅==在检查原始类型时才可靠。对于对象类型,最好使用以下equals方法:

c.equals(d)
于 2012-09-01T10:02:30.410 回答
1

==和之间的区别equals

在原始数据类型上使用==与在对象引用数据类型上使用不同。

  1. 在原始数据类型==上用作equals.
  2. 对于对象引用数据类型==是指它们的引用。因此对象在内存中指向什么。

考虑案例 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不会编译

在此处输入图像描述

于 2020-01-30T14:49:51.513 回答