为什么浮点对象在 Java 中不相等,而整数对象是?

Why aren't floating point objects equal in Java when integer objects are?

public class MyClass
{
    public static boolean isEqual(Object obj1, Object obj2)
    {
        return obj1==obj2;
    }

    public static void main(String args[])
    {
        //output: true
        System.out.println(2.2f==2.2f);
        //output: false
        System.out.println(isEqual(2.2f,2.2f));
        //output: true
        System.out.println(22L==22L);
        //output: true
        System.out.println(isEqual(22L,22L));
    }
}

以下所有打印语句,除了第二个输出为真。为什么会这样?方法 isEqual() 调用两个整数文字输出 true 而调用两个浮点文字输出 false,但为什么呢?为什么这与常规的 == 比较不同?

您的方法 isEqual() 需要对象作为参数。所以原始 longs 和 floats 被装箱,创建的 Long/Float 实例作为参数传递。这在内部调用方法 Long.valueOf()/Float.valueOf()

您的 Long.valueOf() 实现缓存了一些值和 returns 缓存值(这是允许的,但不是必需的,不像 Integer.valueOf() return 范围 -128 到 127) 的缓存值)。所以Long.valueOf(22L) == Long.valueOf(22L)Float.valueOf().

并非如此

尝试使用更大的 long 值,比较结果将是错误的。

永远不要使用 == 比较对象,除非它们是枚举。使用 equals().