public class test {//声明名为“test”的类
static public void main(String[] args)
{
Long a=111L; //declaring Long type variable
Long b=111L; //declaring Long type variable
Long c=222L; //declaring Long type variable
Long d=222L; //declaring Long type variable
System.out.println((a==b)+" "+(c==d)); /*output is "true false". I dont know Why? Please explain */
}
}
答案 0 :(得分:4)
Long
是关于原始long
的盒装包装器。您应该使用long
。
将基元与==
进行比较,但将Long
之类的对象与aLong.equals(otherLong)
进行比较;否则,当您与==
进行比较时,您正在比较参考相等性。 source
一个可能是真的而另一个是假的,是因为-128到127被缓存Source。因此,任何值为111L的Long对象都是同一个对象,但值为222L的Long与另一个值为222L的Long不同。
由于这种不确定性,您应始终将对象与.equals
进行比较,除非您特别想知道它们是否完全相同。
在这种情况下,我建议您使用原语并按原样进行比较。
答案 1 :(得分:0)
Java caches the wrapper class(Long) objects instances from the range -128 to 127
值为111(缓存)的长变量,所有引用都将指向相同的对象实例。 (N个变量,1个实例)
值为222(未缓存)的长变量,每个引用都会指向一个对象实例。 (N个变量,N个实例)