为什么“==”运算符不起作用

why "==" operator does not work

targetPixValList 是一个包含 Double 对象的列表,它还包含列表中连续位置的相似值,当我尝试使用 Code_1 比较两个 Double 值时,cnt returns 零. 当我使用 code_2 时,cnt returns 值。

列表的类型是

为什么“==”运算符不适用于 Double?

Code_1:

int cnt = 0;
    for (int i = 0; i < cs.targetPixValList.size()-1; i++) {
        if (cs.targetPixValList.get(i) == cs.targetPixValList.get(i+1))
            ++cnt;
    }

Code_2:

 int cnt = 0;
    for (int i = 0; i < cs.targetPixValList.size()-1; i++) {
        if (cs.targetPixValList.get(i).equals(cs.targetPixValList.get(i+1)))
            ++cnt;
    }

Double 是原语 double 的 class 包装器。比较 Double(或对象引用)的实例时使用 equals 方法而不是 ==.

此外,对于您的情况,使用 equals 比较 Double 也可能由于浮点比较(在幕后完成)而给出错误的结果。如果您使用敏感的浮点值,我建议使用 BigDecimal 而不是 Double 并使用 BigDecimal#compareTo 而不是 equals 因为 BigDecimal#equals 不会考虑计算比例,而 BigDecimal#compareTo 计算。

您在比较对象时使用 .equals(otherObject)。您正在比较 Double 这是一个对象。如果您使用的是 double 原语,则可以使用 == 来比较值。

或者,从 Double 对象获取 double 值:

if (yourDoubleObject.doubleValue() == otherDoubleObject.doubleValue()) {
  // Do some things
}

== 运算符在 intlongdouble 等基本类型中给出正确的结果。如果您将运算符与对象一起使用,它将默认比较引用。

使用equals方法可能会根据对象给出正确的结果。您应该重写 equals 方法以从逻辑上接收对象是否相等的检查。

对于 Double 对象,它还检查对象的引用等价性。您应该使用 Double#doubleValue 方法来检查值是否相等。

这是代码;

 for (int i = 0; i < cs.targetPixValList.size()-1; i++) {
        if (cs.targetPixValList.get(i).doubleValue() == cs.targetPixValList.get(i+1).doubleValue())
            ++cnt;
    }

另请参阅:

How to override equals and hashcode