You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中Double类型-999用==与equals()比较的差异疑问

Double与int比较时equals()失效的原因解析

嘿,这个问题确实挺容易踩坑的!我来给你掰扯清楚为啥会出现这种反直觉的情况:

你说的场景是创建了一个存储Double的LinkedList,首元素设为-999(实际是自动装箱成Double类型的-999.0),然后出现了两个让人困惑的结果:

  • listOfNumber.getFirst().equals(-999) 返回 false
  • listOfNumber.getFirst() == -999 返回 true

为啥equals()返回false?

核心原因是Double的equals()方法有严格的类型检查。咱们看看Double类里equals()的核心逻辑:

public boolean equals(Object obj) {
    return (obj instanceof Double)
           && (doubleToLongBits(((Double)obj).value) == doubleToLongBits(value));
}

当你传入-999(int类型)时,Java会自动把它装箱成Integer对象,而非Double。这时候obj instanceof Double的判断直接不成立,方法直接返回false——不管数值是不是一致,类型不对就直接不匹配。

为啥==反而返回true?

这是Java的自动类型转换在起作用:

  1. 当用==比较Double包装类和int基本类型时,Double会先自动拆箱成double基本类型
  2. int类型的-999也会自动提升为double类型的-999.0
  3. 最后比较的是两个double基本类型的数值,自然是相等的,所以返回true

正确的比较方式

如果想通过equals()来比较数值,得保证两边的类型一致:

  • 把int转成Double类型再传:listOfNumber.getFirst().equals(Double.valueOf(-999))
  • 或者直接传double字面量:listOfNumber.getFirst().equals(-999.0)

另外,也可以用更稳妥的Double.compare()方法,它会直接处理类型转换,只比较数值:

Double.compare(listOfNumber.getFirst(), -999) == 0

小提醒

所有包装类的equals()方法几乎都会先做类型校验,所以以后用equals()比较包装类型时,一定要注意两边的类型是否匹配,不然很容易出现这种“明明数值一样却返回false”的坑!

内容的提问来源于stack exchange,提问作者Bighuyou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:47:52