以下两个陈述之间有什么区别
Long l1 = 2L;
if(l1 == 2)
System.out.println("EQUAL");
if(l1.longValue() == 2)
System.out.println("EQUAL");
他们两个都给出了相同的结果“EQUAL”。但我怀疑龙是对象。它是如何平等的?
答案 0 :(得分:11)
正如评论中已经指出的那样,
时if(l1 == 2)
Long
l1
会自动取消装箱到其原始类型long
。因此,比较是long
和int
之间的比较。
在第二种情况下,l1.longValue()
将返回由long
对象表示的Long
的{{1}}值作为基元,因此将再次进行比较在Long
和long
之间。回答your comment,请查看What is the main difference between primitive type and wrapper class?
关于autoboxing的评论中给出的链接很好地涵盖了这个主题。
答案 1 :(得分:-1)
此行为通过扩大和装箱来解释。
在第一个例子中,
if(l1 == 2)
会发生什么如下:
1:编译器注意到您正在将包装器(Long)与原始值(int)进行比较,因此它会对原语进行包装,从而产生:
if (l1 == new Integer(2))
因为2是一个int(它在末尾没有'L')。
2:编译器现在注意到我们正在将Long与Integer进行比较,因此它将Integer扩展为Long,导致:
if (l1 == new Long(new Integer(2))
3:现在我们正在比较两个龙。
另一种情况比较简单,结果很简单:
if(2L == 2)
比较原始值,即使它们是不同的类型也是允许的。