可能重复:
Java 中允许整数 == int
以下两种说法有什么区别
Long l1 = 2L;
if(l1 == 2)
System.out.println("EQUAL");
if(l1.longValue() == 2)
System.out.println("EQUAL");
他们都给出了相同的结果“相等”。但我怀疑 Long 是对象。怎么相等?
可能重复:
Java 中允许整数 == int
以下两种说法有什么区别
Long l1 = 2L;
if(l1 == 2)
System.out.println("EQUAL");
if(l1.longValue() == 2)
System.out.println("EQUAL");
他们都给出了相同的结果“相等”。但我怀疑 Long 是对象。怎么相等?
正如评论中已经指出的那样,当
if(l1 == 2)
Long
l1
自动拆箱为其原始类型,long
. 所以比较是在long
和之间int
。
在第二种情况下,l1.longValue()
将返回对象表示long
的原始值,因此比较将再次在 and 之间进行。回答您的评论,看看原始类型和包装类之间的主要区别是什么?Long
Long
long
int
关于自动装箱的评论中给出的链接很好地涵盖了这个主题。
这种行为可以通过加宽和装箱来解释。
在第一个例子中,
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:现在我们正在比较两个多头。
另一种情况更简单,这里的结果很简单:
如果(2L == 2)
比较原始值,即使它们是不同的类型也是允许的。