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

为何Long与Double使用==比较时行为存在差异?

为什么Double用==比较和Long表现不一样?

这个问题其实和Java的包装类型缓存机制直接相关,咱们一步步拆解来看:

先看你给出的代码片段:

Long v1 = 1L; Long v2 = 1L; Double d1 = 1.0; Double d2 = 1.0;
System.out.println(v1 == v2); // 输出true
System.out.println(d1 == d2); // 输出false
System.out.println(v1.equals(v2)); // 输出true
System.out.println(d1.equals(d2)); // 输出true

核心原因拆解

  • 首先搞懂==在包装类型里比的是什么
    对于Long、Double这种包装类,==比较的是对象的内存引用地址,不是它们存的数值。只有当两个变量指向同一个内存对象时,==才会返回true。

  • Long的缓存优化
    Java为了提升性能,给Long(还有Integer、Byte这些整数类型包装类)做了缓存:对于-128到127之间的数值,JVM会提前创建好这些对象放在缓存里。当你用Long v1 = 1L;这种自动装箱的方式创建对象时,JVM不会新造对象,而是直接从缓存里拿现成的。所以v1和v2指向的是同一个Long对象,==自然返回true。

  • Double为啥没缓存?
    而Double(包括Float)就没有这种缓存机制。原因很简单:整数的取值在小范围内是有限的,缓存-128到127的Long完全划算;但浮点数的取值范围极大,哪怕是常用的小数值区间里,也有无限个可能的浮点数,根本没法做有效的缓存。所以每次用Double d1 = 1.0;创建对象时,JVM都会新建一个Double实例,d1和d2指向的是不同的内存对象,==就返回false了。

  • equals方法才是比数值的正确姿势
    不管是Long还是Double,equals()方法的设计目的就是比较它们实际存储的数值,所以只要数值相同,不管是不是同一个对象,equals都会返回true,这就是最后两行输出都是true的原因。

内容的提问来源于stack exchange,提问作者João Pedro Schmitt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 12:42:39