gpt4 book ai didi

java - 比较盒装 Long 值 127 和 128

转载 作者:IT老高 更新时间:2023-10-28 11:27:07 26 4
gpt4 key购买 nike

我想使用 if 条件比较两个 Long 对象的值。当这些值小于 128 时,if 条件正常工作,但当它们大于或等于 128 时,比较失败。

例子:

Long num1 = 127;
Long num2 = 127;

if (num1 == num2) {
// Works ok
}

上面的代码比较正常,但是下面的代码比较失败:

Long num1 = 128;
Long num2 = 128;

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

为什么比较大于127Long变量会出现问题?如果将变量数据类型更改为长原语,则比较适用于所有情况。

最佳答案

TL;DR

Java 缓存从 -128127 的盒装 Integer 实例。由于您使用 == 来比较对象 references 而不是 values,因此只有缓存的对象会匹配。使用 long 未装箱的原始值或使用 .equals() 来比较您的 Long 对象。

长(双关语)版本

Why there is problem in comparing Long variable with value greater than 127? If the data type of above variable is primitive (long) then code work for all values.

Java caches Integer objects instances from the range -128 to 127 。也就是说:

  • 如果您将值 127 (cached) 设置为 N 个 Long 变量,则所有引用都将指向同一个对象实例。 (N 个变量,1 个实例)
  • 如果您将值 128(未缓存)设置为 N 个 Long 变量,则每个引用都会指向一个对象实例。 (N 个变量,N 个实例)

这就是为什么:

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

另一方面,对于 128 值,由于在内存中没有缓存它的实例,因此为装箱值的任何新分配创建一个新实例,从而产生两个不同的实例(由 val3 和 val4) 指向并在它们之间的比较中返回 false

这仅仅是因为您将两个 Long 对象引用,而不是 long 原始值与 == 运算符。如果没有这种缓存机制,这些比较将总是失败,所以这里真正的问题是用 == 运算符比较装箱值。

将这些变量更改为原始 long 类型可以防止这种情况发生,但如果您需要使用 Long 对象来保存您的代码,您可以安全地使用以下方法:

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

(正确的空值检查是必要的,即使是强制转换)

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

引用链接:

关于java - 比较盒装 Long 值 127 和 128,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20541636/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com