什么不是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.
。