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

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

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

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

 Long id1 = 123L; Long id2 = 123L; System.out.println(id1 == id2); 

它打印真实。

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

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

但是Long id1 = 123L; 将在内部使用Long.valueOf(String)自动将其自动装箱到Long对象,该进程将使用LongCache,并且123位于LongCache [-128,127]之间,因此它们实际上是同一个对象。

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

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

所以它适用于较小的长值

另见

  • 整数包装类和==运算符 - 指定的行为在哪里?

由于使用了== ,因此在4小时内遇到问题。 Long < 128但是更高值的比较是正常的。

通常,使用==比较Objects并不是一个好主意,尽可能使用.equals() ! 对于基元==, >, <, <= etc.保持==, >, <, <= etc.