我学习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::equals
或Objects::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