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

最近检查之前写过的代码,突然发下了一个问题,现场还原如下:
    @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

结语:
在平时使用这些做比较时一定要注意类型区分,不要坠入这好像是正确的”陷阱”里。。。。

猜你喜欢

转载自blog.csdn.net/m0_38043362/article/details/78114208