
Java 中使用 Long 包装类型时,直接用 == 比较两个大数值可能返回 false,即使数值相等——这是因自动装箱后 == 比较的是对象引用而非值,且 Long 缓存机制仅覆盖 [-128, 127] 范围。
java 中使用 `long` 包装类型时,直接用 `==` 比较两个大数值可能返回 `false`,即使数值相等——这是因自动装箱后 `==` 比较的是对象引用而非值,且 `long` 缓存机制仅覆盖 [-128, 127] 范围。
在 Java 中,== 运算符对基本类型(如 long)执行数值比较,但对引用类型(如 Long)默认执行引用比较(即判断是否指向同一内存地址)。当你声明:
Long x = (long) Math.pow(scn.nextLong(), 2); Long y = 2 * scn.nextLong();
虽然 x 和 y 的数值可能完全相等(例如 x = 40000000000000000L,y = 40000000000000000L),但由于它们是通过自动装箱(autoboxing)创建的 Long 对象,JVM 并不会复用已存在的实例(除非值在 -128 到 127 之间),因此 x 和 y 是两个独立的对象,x == y 返回 false。
而 x - y == 0 能正确输出 "YES",是因为该表达式触发了自动拆箱(unboxing):x 和 y 分别被转换为 long 基本类型后再做算术运算,此时比较的是原始数值。
✅ 正确做法有以下两种:
方案一:使用 .equals() 方法(推荐用于包装类型值比较)
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
System.out.println(x.equals(y) ? "YES" : "NO");
注意:.equals() 安全处理 null(需确保非空),且语义明确表示“值相等”。
方案二:统一使用基本类型 long(更高效、无装箱开销)
long x = (long) Math.pow(scn.nextLong(), 2); long y = 2 * scn.nextLong(); System.out.println(x == y ? "YES" : "NO"); // ✅ 此时 == 是数值比较
⚠️ 补充注意事项:
- Math.pow() 返回 double,强制转 long 可能因浮点精度丢失导致错误(如 Math.pow(200000000L, 2) 实际计算为 4.0000000000000003E16,截断后仍正确,但对更大数或非整平方易出错)。建议改用 BigInteger 或手动乘法:long x = input * input;。
- Long.valueOf(long) 在缓存范围内复用对象,但超出范围必新建对象,因此绝不可依赖 == 判断 Long 值相等。
- IDE(如 IntelliJ)通常会对 == 比较包装类型发出警告,应主动响应并修正。
总结:在 Java 中,永远不要用 == 比较包装类型的值;优先使用基本类型,或坚持用 .equals() —— 这是保障数值逻辑正确性的关键习惯。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










