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,但为什么呢?为什么这种操作与常规==比较不同?
答案 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()
。