为什么浮点对象在 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()
.
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()
.