如何确保==将始终使用基元作为相等测试

时间:2013-10-30 15:20:26

标签: java equals equality primitive autoboxing

根据我的理解,如果我有两个longint,则有时会因自动装箱而无法使用==运算符来测试值的相等性。

在处理原语时,我需要做些什么才能确保==在每种可能的情况下都有效?

3 个答案:

答案 0 :(得分:7)

向后兼容性要求(和JLS同意),如果你有一个像

这样的表达式
double a = ..
double b = ...
if (a == b) // condition

此条件必须与自动装箱前的方式相同,就像自动装箱后一样。这意味着自动装箱不能也不能在这里适用。

实际上,如果可以使用取消装箱,则自动装箱从不用于编译==表达式。

Integer i = 1000;
int j = 1000;
System.out.println(i == j); // is true

在这种情况下,选择取消装箱而非拳击。

答案 1 :(得分:2)

JLS(§15.21.1)说:

  

如果等于运算符的操作数都是数字类型,或者一个是数字类型而另一个是可转换的(第5.1.8节)是数字类型,则对操作数执行二进制数字提升(第5.6.2节) )。

     

请注意,二进制数字促销执行值集转换(第5.1.13节)并可执行拆箱转换(第5.1.8节)。

因此,只有当两个操作数都是盒装类型(DoubleInteger等)时,才会出现您描述的问题。操作数类型是否装箱取决于操作数的声明方式。如果它是变量,字段或参数,则取决于用于声明名称的类型;如果它是一个方法调用,它取决于声明方法时使用的返回类型;如果它是+之类的其他操作的结果,则它应该已经取消装箱;如果已应用类型转换,则演员将告诉您类型是什么。

正如其他人所说,由于四舍五入错误,你通常不应该使用==来比较双打或浮点数。

答案 2 :(得分:0)

Fafaik你不能用两个原始拳击。拳击发生在您(例如)和int以及IntegerdoubleDouble时。取消装箱从“框”(等效的对象)中获取原语,然后将两个基元与==运算符进行比较,在这种情况下,不能保证它们是相同的。如果您有两个double,那么您将不会遇到此问题。