31

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

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

以上两个返回值都是对象类型的 Long,这让我很困惑。并验证我是否编写了这样的主要方法:

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

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

它打印真实。

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

4

3 回答 3

51

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

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

于 2013-10-21T03:32:29.793 回答
8

因为==比较参考值,较小的长值被缓存

 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);
 }

所以它适用于较小的长值

另见

于 2013-10-21T03:28:11.130 回答
2

由于使用==...而在一个问题上停留了 4 个小时。比较还可以,Long < 128但在更大的值上比较好。

==一般用比较不好Objects.equals()尽量用!保留==, >, <, <= etc.原语。

于 2017-09-22T10:19:57.437 回答