为什么Java中的两个长变量不等于==运算符?

为什么Java中的两个长变量不等于==运算符?,java,equals,long-integer,Java,Equals,Long Integer,当我试图比较两个长变量时,遇到了一个非常奇怪的问题,它们总是显示为false,通过在Eclipse中调试,我可以确保它们具有相同的数值: if (user.getId() == admin.getId()) { return true; // Always enter here } else { return false; } 以上两个返回值都是对象类型Long,这让我很困惑。为了验证我写了这样一个主方法: Long id1 = 123L; Long id2 = 123L;

当我试图比较两个长变量时,遇到了一个非常奇怪的问题,它们总是显示为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);
这是真的


有人能给我一些想法吗?。我在Java开发领域工作了3年,但无法解释这个案例

因为
==
比较参考值,并且更小

公共静态长值of(长l){
最终整数偏移=128;

如果(l>=-128&&l
=
比较引用,
.equals()
比较值。这两个长度是对象,因此在使用
=
运算符时比较对象引用


但是,请注意,在
Long id1=123L;
literal value
123L
中,将使用
Long.valueOf(String)
自动装箱到
Long
对象中,并且在内部,此过程将使用具有
[-128127]的LongCache
范围,123在此范围内,这意味着长对象被缓存,而这两个对象实际上是相同的对象。

由于使用了
=
,所以在一个问题上停留了4个小时。
长<128
的比较是可以的,但在较大的值上比较是可以的


一般来说,使用
=
来比较
对象不是一个好主意,尽可能多地使用
.equals()
!保持
==,>,这取决于长的大小。较小的长和整数是相互交织的,是真正相同的对象,但较长的则不是,对于这些对象,您需要使用
.equals(…)
或取消装箱。但是user.getId()在我的例子中只返回16,我认为它足够小。如何解释它?在我的例子中,返回的ID值是16,没有超出它的范围。是的,但是那些长可能不是由Long.valueOf()创建的,我可能是新长(12),因此,它们是不同的对象。运行时实现保证缓存
整数
值-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);
 }