繁体   English   中英

比较 double 和 Double 之间的区别

[英]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 直接比较是错误的。 请为我解释。

cd在技​​术上是两个不同的对象,而==运算符只比较引用。

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); 

正在检查cd是否引用相同的对象。 Java 中的自动装箱总是(我相信)为floatdouble创建一个新对象(整数类型1的情况更复杂)。 因此cd指的是不同的对象,因此它打印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区别

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

  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是否相等。

它还取决于它被调用的对象的实现。 对于Stringsequals()检查其中的字符。

    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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM