为什么 2 Long 变量在 Java 中不等于 == 运算符?

2022-09-01 10:31:47

当我尝试比较2个Long变量时,我遇到了一个非常奇怪的问题,它们总是显示false,我可以通过在Eclipse中调试来确保它们具有相同的数字值:

if (user.getId() == admin.getId()) {
    return true; // Always enter here
} else {
    return false;
}

以上 2 个返回值都是对象类型的 Long,这让我感到困惑。为了验证我写了一个像这样的主要方法:

Long id1 = 123L;
Long id2 = 123L;

System.out.println(id1 == id2);

它打印真实。

所以有人可以给我一些想法吗?我已经在Java开发领域工作了3年,但无法解释这种情况。


答案 1

==比较引用,比较值。这两个 Long 是对象,因此在使用运算符时会比较对象引用。.equals()==

但是,请注意,在文本值中,使用 会自动装箱到对象中,在内部,此过程将使用具有范围的 LongCache,并且 123 在此范围内,这意味着 long 对象被缓存,这两个对象实际上是相同的对象。Long id1 = 123L;123LLongLong.valueOf(String)[-128,127]


答案 2

因为比较参考值,并且缓存较小的长整型值==

 public static Long  valueOf(long l) {
     final int offset = 128;
     if (l >= -128 && l <= 127) { // will cache
         return LongCache.cache[(int)l + offset];
     }
     return new Long(l);
 }

因此,它适用于较小的长整型值

另请参见


推荐