当前位置: 首页 > 知识库问答 >
问题:

为什么“==”运算符不起作用[重复]

范翰海
2023-03-14

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

列表的类型是

为什么“==”运算符不能与Double一起使用?

代码_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个答案

姜志行
2023-03-14

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

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

对于对象,它还检查对象的参照等效性。您应该使用双精度值方法来检查值等效性。

这是代码;

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

另请参见:

如何覆盖equals和hashcode

姜宏盛
2023-03-14

您在比较对象时使用. equals(另类对象)。您正在比较Double,它是一个对象。如果您使用Double作为原语,您可以使用==来比较值。

或者,从双精度对象获取双精度值:

if (yourDoubleObject.doubleValue() == otherDoubleObject.doubleValue()) {
  // Do some things
}
梁存
2023-03-14

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

此外,对于您的情况,使用等于来比较Double也可能由于浮点比较(在幕后进行)而给出错误的结果。如果您使用的是敏感浮点值,我建议使用<code>BigDecimal</code>而不是<code>Double</code>,并使用<code>BigDecimal#compareTo</ccode>而不是 ,因为<code〕BigDeximal#equals>不考虑小数位数,而<code>bigDecical#compereTo</code>则考虑小数位数。

 类似资料:
  • 问题内容: 我正在通过Daniel liang在第9章“字符串”中的“ Java编程第9版简介”来学习Java,我遇到了这段代码: 好吧,有人可以解释一下这里发生了什么吗?如何从整数中添加子字符,其背后的含义是什么,谢谢。 问题答案: 来自文档 char数据类型是单个16位Unicode字符。 A 由其代码点值表示: 分钟(或0) 最多:(或65,535) 您可以在ASCII表上看到所有英文字母代

  • 问题内容: 这段代码有什么问题: 问题答案: 三元运算符不能有不返回值或方法的语句。您需要具有返回值的语句。 您需要重写它。

  • 问题内容: 从C ++到Java,一个显而易见的未解决问题是Java为什么不包括运算符重载? 没有;比这简单;吗? 是否存在已知的原因,有效的论据,不使运算符重载?原因是任意的还是迷失了时间? 问题答案: 假设你想覆盖所引用的对象的先前值a,则必须调用成员函数。 在C ++中,此表达式告诉编译器在堆栈上创建三(3)个对象,执行加法,然后将结果值从临时对象复制到现有对象中。 但是,在Java中,不对

  • 问题内容: Netbeans说我的三元运算符不是语句。怎么会? 我尝试过if / then / else对应项,并且工作正常: 问题答案: 三元运算符中的语句必须是非空的。他们需要退货。

  • 问题内容: 在这里, 我有两个变量,它们通过生成随机数。我希望它们继续滚动,直到两个变量同时生成两个不同的值。因此,我为此使用循环。正如我也明白了,请纠正我,如果我错了,行意为,不断翻滚,直到值 不等于5 和 不等于4 。但是,如果其中一个变量与其值匹配(diceRolled1 = 5 或 diceRolled2 = 4),则程序结束。这不是应该做什么,对吗?我已经运行了大约10次的代码,但是没有

  • 代码如下: 运行时,这是错误消息: 错误:不匹配'运算符*'(操作数类型是'std::__cxx11::字符串{aka std::__cxx11::basic_string 如何修复此错误并使程序正确运行?