Java中的equals()方法在Long数据类型上意外地工作

Lio*_*ion 23 java

我们首先考虑Java中的以下表达式.

Integer temp = new Integer(1);
System.out.println(temp.equals(1));

if(temp.equals(1))
{
     System.out.println("The if block executed.");
}
Run Code Online (Sandbox Code Playgroud)

这些所有陈述都很好.毫无疑问.表达式按预期temp.equals(1)计算,因此块中true的唯一语句将if被执行.


现在,当我从更改数据类型IntegerLong,该语句temp1.equals(1)意外评价false如下.

Long temp1 = new Long(1);
System.out.println(temp1.equals(1));

if(temp1.equals(1))
{
    System.out.println("The if block executed.");
}
Run Code Online (Sandbox Code Playgroud)

这些是前面片段中提到的等价语句,只是数据类型已经改变,它们的行为正好相反.

表达式temp1.equals(1)被计算false,因此,if块中的唯一语句不会执行与前面语句相反的语句.怎么样?

Jac*_*nds 37

你要比较一个Long和一个int.javadoc java.lang.Long#equals表示该equals方法

将此对象与指定的对象进行比较.当且仅当参数不为null并且是包含与此对象相同的long值的Long对象时,结果才为真.

相反,尝试System.out.println(new Long(1).equals(1L)); 现在,您比较一LongLong,而不是Long一个Integer,它会打印true.


Ósc*_*pez 7

文本值1不是一个long,这是一个int.请尝试使用以上代码:

System.out.println(temp1.equals(1L));
Run Code Online (Sandbox Code Playgroud)

if (temp1.equals(1L))
Run Code Online (Sandbox Code Playgroud)

如您所见,L在文字值之后加上一个1表示它是a long,然后比较按预期工作.


Ant*_*nyM 7

您可以进行比较的原因是因为Java中的自动装箱.

您调用的实际方法是:

http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Long.html#equals(java.lang.Object)

这是将您的Long对象与其他对象进行比较,而不是与实际的原始int进行比较.

当你调用这个方法时会发生什么,你的原语integer(1)被自动编码为一个,Object(Integer)所以你有效地调用:

new Long(1).equals(new Integer(1));
Run Code Online (Sandbox Code Playgroud)

这就是它失败的原因.

这就是你打电话的原因

new Long(1).equals(1L) 
Run Code Online (Sandbox Code Playgroud)

这样可以工作,因为Java会将1L(原语long,而不是int)自动装入Long对象,而不是Integer对象.