什么不是2长变量等于==运算符在Java中进行比较?

Bra*_*Zhu 18 java equals long-integer

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

if (user.getId() == admin.getId()) {
    return true; // Always enter here
} else {
    return false;
}
Run Code Online (Sandbox Code Playgroud)

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

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

System.out.println(id1 == id2);
Run Code Online (Sandbox Code Playgroud)

它打印真实.

有人可以给我一些想法吗?我已经在Java Development工作了3年但是无法解释这个案例.

Bla*_*ker 34

==比较参考,等于比较值.这两个Long是Object,所以他们比较引用.

但是==.equals()内部使用自动自动装箱到Long对象,进程将使用LongCache,而123位于LongCache [-128,127]之间,因此它们实际上是同一个对象.


Jig*_*shi 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);
 }
Run Code Online (Sandbox Code Playgroud)

所以它适用于较小的长值

另见