为什么在Java中使用==操作符时,2个Long变量不相等?

问题描述 投票:21回答:3

我遇到了一个很奇怪的问题,当我试图比较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);

它的打印结果是true.

所以谁能给我出出主意?我从事Java开发工作3年了,但无法解释这个案例。

java equals long-integer
3个回答
43
投票

== 比较引用。.equals() 比较值。这两个Longs是对象,因此在使用 == 运营商。

然而,请注意,在 Long id1 = 123L; 字面价值 123L 将会被自动装箱到一个 Long 使用 Long.valueOf(String),在内部,这个过程将使用一个LongCache,它有一个 [-128,127] 范围内,而123就在这个范围内,也就是说,长对象被缓存了,这两个其实是同一个对象。


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

所以它适用于较小的长值

另见


1
投票

在一个问题上纠结了4个小时,因为使用了 == ... 比较确定的是 Long < 128 但考上更大的数值。

一般情况下,不建议使用 == 来比较 Objects,使用 .equals() 尽可能多的!保持 ==, >, <, <= etc. 对于基元。

© www.soinside.com 2019 - 2024. All rights reserved.