使用equals()比较包装类和基元会产生奇怪的行为

Sne*_*tel 15 java equals wrapper

考虑下面的代码捕捉.我们equals()用来比较对象是否有意义?这两个值都有意义相等,但为什么会longWrapper.equals(0)返回false?当我将两个值与==运算符进行比较时,它返回true.

    Long longWrapper = 0L;
    long longPrimitive = 0;

    System.out.println(longWrapper == 0L); // true
    System.out.println(longWrapper == 0); //true
    System.out.println(longWrapper == longPrimitive); //true


    System.out.println(longWrapper.equals(0L)); //true
    System.out.println(longWrapper.equals(0));  //false
    System.out.println(longWrapper.equals(longPrimitive)); //true
Run Code Online (Sandbox Code Playgroud)

Kon*_*kov 18

longWrapper.equals(0)返回false,因为0是自动装箱Integer,而不是Long.由于两种类型不同,因此.equals()返回false.

同时,longWrapper == 0true因为该longwrapper值未拆箱0,并且0 == 0没有考虑实际的基元类型.