Java 如何确保==始终作为相等测试使用原语
据我所知,如果我有两个Java 如何确保==始终作为相等测试使用原语,java,equals,equality,primitive,autoboxing,Java,Equals,Equality,Primitive,Autoboxing,据我所知,如果我有两个long或int,用于测试值相等性的=运算符有时由于自动装箱而无法工作 在处理基本体时,我需要做些什么来确保==在任何可能的情况下都能工作?Fafaik您无法使用两个基本体进行装箱。装箱发生在您要取(例如)和int和Integer或double和double时。取消装箱从“框”(对象等价物)获取原语,然后用=运算符比较这两个原语,在这种情况下,不能保证它们是相同的。如果您有两个doubles,则不会出现此问题。向后兼容性要求(JLS同意)如果您有如下表达式 double a
long
或int
,用于测试值相等性的=
运算符有时由于自动装箱而无法工作
在处理基本体时,我需要做些什么来确保
==
在任何可能的情况下都能工作?Fafaik您无法使用两个基本体进行装箱。装箱发生在您要取(例如)和int
和Integer
或double
和double
时。取消装箱从“框”(对象等价物)获取原语,然后用=
运算符比较这两个原语,在这种情况下,不能保证它们是相同的。如果您有两个double
s,则不会出现此问题。向后兼容性要求(JLS同意)如果您有如下表达式
double a = ..
double b = ...
if (a == b) // condition
此条件的工作方式必须与自动装箱前和自动装箱后相同。这意味着自动装箱不能也不能应用于此
事实上,如果可以使用取消装箱来编译==表达式,则永远不会使用自动装箱
Integer i = 1000;
int j = 1000;
System.out.println(i == j); // is true
在这种情况下,选择拆箱而不是装箱。JLS(§15.21.1)规定:
如果相等运算符的操作数都是数字类型,或者一个是数字类型,另一个可转换为数字类型(§5.1.8),则对操作数(§5.6.2)执行二进制数字提升
请注意,二进制数字升级执行值集转换(§5.1.13)并可能执行取消装箱转换(§5.1.8)
因此,只有当两个操作数都是装箱类型(Double
、Integer
等)时,才会出现您描述的问题。操作数类型是否装箱取决于操作数的声明方式。如果是变量、字段或参数,则取决于用于声明名称的类型;如果是方法调用,则取决于声明方法时使用的返回类型;如果它是其他操作的结果,如+
,则应该已经解除绑定;如果应用了类型转换,该转换将告诉您类型是什么
正如其他人所说,由于舍入错误,通常不应该使用
==
来比较double或float。如果两个操作数都是基元类型,它不会装箱…AIUI,将double
值与=
进行比较很少是一个好主意。有一些info@DuncanJones这是来自int
或long
的typecastdouble
您能提供一个触发您所描述问题的代码示例吗?不,这是错误的。如果您比较一个double
和一个double
,它将取消对double
的装箱,而不是将double
装箱。很抱歉,您完全正确-我将立即更改此项。语句自动装箱从未用于编译==表达式
不完全正确。如果a
被声明为对象
并且b
被声明为int
,a==b
将自动装箱b
为整数
。