Java ==如果比较具有相同值的双精度类型,则运算符返回false

Java ==如果比较具有相同值的双精度类型,则运算符返回false,java,equals,autoboxing,Java,Equals,Autoboxing,当我比较两个具有相同值的双基元类型时,为什么equal方法为false?然而,整数不是 public class EqualMethod { public static void main(String[] args) { Double value1 = 6.2; Double value2 = 6.2; System.out.println(value1 == value2); Integ

当我比较两个具有相同值的双基元类型时,为什么equal方法为false?然而,整数不是

public class EqualMethod {
    public static void main(String[] args) {        
        Double value1 = 6.2;
        Double value2 = 6.2;        
        System.out.println(value1 == value2);

        Integer number1 = 2;
        Integer number2 = 2;
        System.out.println(number1 == number2);  
    } 
}

您正在比较引用,而不是值。或者:

value1.等于(value2)

或者:

value1.doubleValue()==value2.doubleValue()


阅读更多关于这里的内容,找出为什么它有时有效(对于整数),有时无效。请注意,所有整数都是2:6=2+4的幂的和,而小数不是:6.2=4+2+1/8+…

您是在比较引用而不是值。或者:

value1.等于(value2)

或者:

value1.doubleValue()==value2.doubleValue()


阅读更多关于这里的内容,找出为什么它有时有效(对于整数),有时无效。请注意,所有整数都是2:6=2+4的幂的和,而小数不是:6.2=4+2+1/8+…

这两个变量都是通过装箱转换为双
对象初始化的。在对象上使用
=
时,如果引用是同一对象,则会比较引用,而不会比较内容


要比较内容,可以使用,也可以检查调用的结果是否等于
0
。或者,您可以将这两个变量声明为
double
,然后
=
将直接比较值。

这两个变量都通过装箱转换为
double
对象进行初始化。在对象上使用
=
时,如果引用是同一对象,则会比较引用,而不会比较内容


要比较内容,可以使用,也可以检查调用的结果是否等于
0
。或者,您可以将这两个变量声明为double,然后将直接比较值。

=
用于参考比较

.equals
用于内容比较

1.在代码中,将创建两个对象,其中引用
value1
value2
指向不同的对象。如果使用
value1==value2
它将返回
false
。如果引用指向同一对象,它将返回
true

Double value1 = 6.2;
Double value2 = 6.2;   

2.如果使用
value1.equals(value2)
它将比较对象的内容,这些内容将返回
true

=

=
用于参考比较

Double value1 = 6.2;
Double value2 = 6.2;   
.equals
用于内容比较

1.在代码中,将创建两个对象,其中引用
value1
value2
指向不同的对象。如果使用
value1==value2
它将返回
false
。如果引用指向同一对象,它将返回
true

Double value1 = 6.2;
Double value2 = 6.2;   

2.如果使用
value1.equals(value2)
它将比较对象的内容,返回
true

equals()
用于比较对象,
=
用于原始数据类型。顺便说一句,尝试执行
Double value1=Double.valueOf(6.2);Double value2=Double.valueOf(6.2)Double
对象来表示相同的值。看,这些不是primitives@2rs2ts他没有使用
newdouble(6.2)
(分配新对象),因此我怀疑
valueOf
是否有任何优势;只是乱七八糟的是的,会的。6.2远不是经常要求的值。而
Double d=6.2
被编译为
Double d=Double.valueOf(6.2)
,而不是
Double d=new Double(6.2)
。因此,您的代码是一种更为冗长的方式来编写与OP完全相同的内容
返回新的Double(d)
equals()
用于比较对象,
=
用于原始数据类型。顺便说一句,尝试执行
Double value1=Double.valueOf(6.2);Double value2=Double.valueOf(6.2)Double
对象来表示相同的值。看,这些不是primitives@2rs2ts他没有使用
newdouble(6.2)
(分配新对象),因此我怀疑
valueOf
是否有任何优势;只是乱七八糟的是的,会的。6.2远不是经常要求的值。而
Double d=6.2
被编译为
Double d=Double.valueOf(6.2)
,而不是
Double d=new Double(6.2)
。因此,您的代码是一种更为冗长的方式来编写与OP完全相同的内容
返回新的Double(d)
或用
Double
替换
Double
@BalusC是的,这是我的答案:)整数有相同的值,为什么它是真的呢?
整数(以及所有其他非fp
数字
实现)用于-128和127之间的值。尝试一个超出此范围的数字:)@Durdona
Integer
有点不同,请参阅以获取解释。或者将
Double
替换为
Double
@BalusC是的,这是我的答案:)具有相同值的整数为什么为真呢?
Integer
(以及所有其他非fp
number
实现)用于-128 en 127之间的值。请尝试超出此范围的数字:)@Durdona
Integer
稍有不同,请参阅以获取解释。
Double value1 = 6.2;
Double value2 = 6.2;