为什么Java中的两个长变量不等于==运算符?
当我试图比较两个长变量时,遇到了一个非常奇怪的问题,它们总是显示为false,通过在Eclipse中调试,我可以确保它们具有相同的数值:为什么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;
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 value123L
中,将使用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);
}