最近检查之前写过的代码,突然发下了一个问题,现场还原如下:
@Test
public void testEquals2(){
System.out.println(new Long(1000).equals(1000));
}
根据平时对基础的理解,乍一看,没什么问题,但是经过运行得出的结果为:false
于是:
@Test
public void testEquals(){
System.out.println(new Long(1000).equals(1000)); //false
System.out.println(new Long(1000).equals(1000L)); //true
System.out.println(1000l == 1000);//true
}
结果输入依次为:
false
true
true
分析原因:
虽然在基本数据类型的比较中long 1000与 int 1000 是相等的,因为这里面有个自动类型提升,会将
int 自动类型提升为long类型,最终就是1000L == 1000L了所以,一定是相等的,而使用包装数据
类型java.lang.Long时,由于是做equals对象比较,如果是不同数据类型就一定不会认定为相等,看
java.lang.Long.equals();方法源码:
public boolean equals(Object obj) {
if (obj instanceof Long) {
return value == ((Long)obj).longValue();
}
return false;
}
如果不是Long类型就直接认定为不相等,而java.lang.Integer与java.lang.Long类型是同样继承自java.lang.Number类,所以,不管是什么Integer 与Long 比较永远不会相等。
在new Long(1000).equals(1000)中,1000会自动(根据基本数据类型进行装箱)装箱为java.lang.Integer而不是java.lang.Long类型
所以。。。。。
@Test
public void test(){
Object x = 1000;
Object y = 1000L;
Object z = 1000d;
System.out.println(x.getClass());
System.out.println(y.getClass());
System.out.println(z.getClass());
}
结果分别是:
class java.lang.Integer
class java.lang.Long
class java.lang.Double
结语:
在平时使用这些做比较时一定要注意类型区分,不要坠入这好像是正确的”陷阱”里。。。。