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

2022-09-02 12:45:41

请考虑以下代码快照。我们用来比较的对象是否有意义地等价?在这里,两个值在有意义地相等,但为什么返回?当我将两个值与运算符进行比较时,它返回。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

答案 1

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

同时,is 是 ,因为该值已取消装箱到 ,而不考虑实际的基元类型。longWrapper == 0truelongwrapper00 == 0


答案 2

这是因为 0 不是长整型 - 它是一个 int,并且包装器不会将 Integer 转换为 Long 的


推荐