这段代码的输出是什么,为什么?请向我解释

时间:2017-08-01 19:04:54

标签: java oop

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  */
}

}

2 个答案:

答案 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个实例)