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;
}
答案 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)
==
运算符会在int
,long
,double
等基本类型中提供正确的结果。如果将运算符与对象一起使用,它将默认比较引用。
使用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;
}
另见: