Java中Double类型-999用==与equals()比较的差异疑问
Double与int比较时equals()失效的原因解析
嘿,这个问题确实挺容易踩坑的!我来给你掰扯清楚为啥会出现这种反直觉的情况:
你说的场景是创建了一个存储Double的LinkedList,首元素设为-999(实际是自动装箱成Double类型的-999.0),然后出现了两个让人困惑的结果:
listOfNumber.getFirst().equals(-999)返回falselistOfNumber.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的自动类型转换在起作用:
- 当用
==比较Double包装类和int基本类型时,Double会先自动拆箱成double基本类型 int类型的-999也会自动提升为double类型的-999.0- 最后比较的是两个
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
相关产品推荐
相关产品推荐

