【问题标题】:Why are 2 Long variables not equal with == operator in Java?为什么 2 个 Long 变量不等于 Java 中的 == 运算符?
【发布时间】:2013-10-21 03:27:22
【问题描述】:

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

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

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

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

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

它打印的是真的。

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

【问题讨论】:

  • 这取决于 Long 的大小。较小的 Long 和 Integer 是隐藏的,并且是真正相同的对象,但较长的不是,对于这些,您需要使用 .equals(...) 或将它们拆箱。

标签: java equals long-integer


【解决方案1】:

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

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

【讨论】:

  • 在我的情况下,返回的 ID 值为 16,未超出其范围。
  • 是的,但是那些 Long 可能不是 Long.valueOf() 创建的,可能是 new Long(12),所以它们是不同的对象。
  • 运行时实现保证缓存Integer值-128..127。如果运行时碰巧注意到这样做在特定情况下是有利的,那么超出该范围或任何其他数字类型(例如Long)的值可能会被缓存,但规范没有说明运行时将在哪些有利情况下进行否则将无法识别。
【解决方案2】:

因为==比较参考值,而long values are cached比较小

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

所以它适用于较小的长值

另见

【讨论】:

  • 但 user.getId() 在我的情况下只返回 16,我认为它足够小。怎么解释?
【解决方案3】:

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

一般用==比较Objects不是个好主意,尽量用.equals()!保留==, &gt;, &lt;, &lt;= etc. 用于原语。

【讨论】:

  • 基元和枚举
猜你喜欢
  • 1970-01-01
  • 2012-06-03
  • 2011-12-10
  • 2010-11-18
  • 1970-01-01
  • 2011-09-17
  • 2017-05-10
  • 1970-01-01
  • 2016-07-11
相关资源
最近更新 更多