当整数对象出现时,为什么Java中的浮点对象不相等?

时间:2018-01-22 07:37:02

标签: java object equality

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));
    }
}

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

1 个答案:

答案 0 :(得分:3)

您的方法isEqual()期望对象作为参数。因此,原始long和浮点数被装箱,并且创建的Long / Float实例作为参数传递。这在内部调用方法Long.valueOf() / Float.valueOf()

Long.valueOf()的实现会缓存一些值并返回缓存值(允许这样做,但不需要这样做,这与Integer.valueOf()不同,后者需要返回范围-128到127的缓存值)。所以Long.valueOf(22L) == Long.valueOf(22L)Float.valueOf()就是这种情况。

尝试使用较大的长值,并且比较将为false。

您绝不应该使用==来比较对象,除非它们是枚举。使用equals()