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

比较装箱的长值127和128

干浩阔
2023-03-14
Long num1 = 127;
Long num2 = 127;

if (num1 == num2) {
    // Works ok
}
Long num1 = 128;
Long num2 = 128;

if (num1 == num2) {
    // Does NOT work
}

共有1个答案

有权
2023-03-14

DR

Java缓存从-128127的装箱整数实例。由于您使用==来比较对象引用而不是值,因此只有缓存的对象才会匹配。使用long未装箱的基元值或使用.equals()比较long对象。

长(双关语)版本

    null
Long val1 = 127L;
Long val2 = 127L;

System.out.println(val1 == val2);

Long val3 = 128L;
Long val4 = 128L;

System.out.println(val3 == val4);

输出如下:

True
false

对于127L值,由于两个引用(val1和val2)都指向内存(缓存)中的同一个对象实例,因此它返回true

System.out.println(val3.equals(val4));                     // true
System.out.println(val3.longValue() == val4.longValue());  // true
System.out.println((long)val3 == (long)val4);              // true

在处理对象比较时,坚持使用.equals()方法总是一个好主意。

引用链接:

  • https://today.java.net/pub/a/today/2005/03/24/autoboxing.html
  • https://blogs.oracle.com/darcy/entry/boxing_and_caches_integer_valueof
  • http://java.dzone.com/articles/surface-results-autoboxing
 类似资料:
  • 问题内容: 我想使用条件比较两个 Long 对象的值。当这些值 小于128时 ,条件将正常工作,但是当这些 值大于或等于128时 ,比较将失败。 例: 上面代码的比较正常进行,但是下面代码失败: 为什么将 Long 变量与 大于127的 值进行比较会出现问题?如果将变量数据类型更改为 长原语 ,则比较适用于所有情况。 问题答案: TL; DR Java将装箱的Integer实例从缓存到。由于您用于

  • 我读到这些方法返回值的规则是,对于obj1.compareTo(ob2),例如,如果ob2在层次结构中位于ob1之下,则返回值为负值,如果它位于ob1之上,则返回值为正(如果它等于,则返回值为0)。然而,在我的类中,我看到了使用Math.signum在compareTo方法中获得-1(表示负值)和1(表示正值)的示例。 有什么原因吗? 编辑: 以下是我的意思:

  • 问题内容: 输出: 输出: 注意:-128至127之间的数字为真。 问题答案: 当你使用Java编译数字文字并将其分配给Integer(大写)时,编译器将发出: 当你使用自动装箱时,也会生成此行代码。 valueOf 实现了“合并”某些数字,对于小于128的值,它将返回相同的实例。 从Java 1.6源代码的第621行: high可以使用system属性将的值配置为另一个值。 如果使用该系统属性运

  • 有人能解释一下这个结果吗? 这是我的代码: 结果是: 首先: 这很奇怪,因为我只声明了一个模板类“T”。第一个比较结果为false,因为val1是long,val2是int(我已经通过debuger进行了检查)。但不应该是这样,因为我只声明了一个模板类,并且两个模板类都是相同的。 和 第二: 为什么每个大于127的“长”大数都不相等?? 谢啦!

  • 我们知道,在数学中有很多用于比较大小的运算符。 在 JavaScript 中,它们的编写方式如下: 大于 / 小于:a > b,a < b。 大于等于 / 小于等于:a >= b,a <= b。 检查两个值的相等:a == b,请注意双等号 == 表示相等性检查,而单等号 a = b 表示赋值。 检查两个值不相等。不相等在数学中的符号是 ≠,但在 JavaScript 中写成 a != b。 在本

  • 我试图理解以下代码在Java中使用数值比较运算符比较2个整数对象时的行为。