您的位置:首页 > 编程语言 > Java开发

java中包装数据类型与基本数据类型比较相等的问题

2017-09-27 16:21 363 查看
最近检查之前写过的代码,突然发下了一个问题,现场还原如下:


@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

结语:

在平时使用这些做比较时一定要注意类型区分,不要坠入这好像是正确的”陷阱”里。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java