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

时间:2015-04-27 15:32:05

标签: java list arraylist double

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

,列表的类型是

为什么“==”运算符不适用于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;
    }

3 个答案:

答案 0 :(得分:7)

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

此外,对于您的情况,由于浮点比较(在幕后完成),使用Double进行equals的比较也会得出错误的结果。如果您正在处理敏感浮点值,建议您使用BigDecimal代替Double并使用BigDecimal#compareTo而不是equals,因为BigDecimal#equals不会考虑到比例,BigDecimal#compareTo确实如此。

答案 1 :(得分:1)

比较对象时使用.equals(otherObject)。您正在比较作为对象的Double。如果您使用double代替原语,则可以使用==来比较值。

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

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

答案 2 :(得分:0)

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

使用equals方法可能会根据对象提供正确的结果。您应该覆盖equals方法以便逻辑地检查对象是否等于。

对于Double对象,它还会检查对象的referance等效性。您应该使用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