长比较时出现意外结果

  • 本文关键字:意外 结果 比较 java
  • 更新时间 :
  • 英文 :


我学习Java已经有一段时间了,最近在进行Long比较时偶然发现了一个奇怪的结果。

下面是一段代码:

public class Test {
public static void main(String[] args) {
Long a = 100L;
Long b = 100L;

Long c = 150L;
Long d = 150L;
System.out.println(a == b);
System.out.println(c == d);
}
}
true
false

我知道,虽然Java不支持在引用类型与==之间进行一般比较,但它通常会缓存所有硬编码的常量值,然后对它们进行智能比较。

我真的相信这一点,直到我的代码崩溃。经过一些繁琐的调试,我发现了这个错误,甚至在几行中复制了它。

这是怎么回事?

Java缓存0-127的值。因此,对于这些值,大写Long上的==将为真。但其他都是假的。

但这不是你应该依赖的行为。只要用Long::equalsObjects::equals

下面是一个代码示例。


private class SOQ_20221222_1
{

public SOQ_20221222_1()
{

Long a = 100L;
Long b = 100L;

Long c = 101L;
Long d = 101L;

Long e = 102L;
Long f = 102L;

Long g = 126L;
Long h = 126L;

Long i = 127L;
Long j = 127L;

Long k = 128L;
Long l = 128L;

Long m = 129L;
Long n = 129L;

System.out.println(a == b);
System.out.println(c == d);

System.out.println(e == f);
System.out.println(g == h);

System.out.println(i == j);
System.out.println(k == l);

System.out.println(m == n);

}

}

true
true
true
true
true
false
false

最新更新