两个Java运算符之间的差异:!=vs!等于
这个代码是:两个Java运算符之间的差异:!=vs!等于,java,operators,Java,Operators,这个代码是: elem1!=elem2 相当于这个吗 !elem1.equals(elem2) 它是双向编译的,但我仍然不确定…一般来说,它们不一样。第一个版本检查elem1和elem2是否是对同一对象的引用(假设它们不是基元类型)。第二个版本调用特定于类型的方法来检查两个(可能不同的)对象在某种意义上是否“相等”(通常,这只是检查它们的所有成员字段是否相同) 我认为这与泛型无关。=(扩展为!=)检查对象标识,也就是说,如果两个对象都引用同一个实例equals检查更高级别的标识概念,通常检查
elem1!=elem2
相当于这个吗
!elem1.equals(elem2)
它是双向编译的,但我仍然不确定…一般来说,它们不一样。第一个版本检查
elem1
和elem2
是否是对同一对象的引用(假设它们不是基元类型)。第二个版本调用特定于类型的方法来检查两个(可能不同的)对象在某种意义上是否“相等”(通常,这只是检查它们的所有成员字段是否相同)
我认为这与泛型无关。=
(扩展为!=
)检查对象标识,也就是说,如果两个对象都引用同一个实例equals
检查更高级别的标识概念,通常检查对象的“值”是否相等。这意味着什么取决于在特定对象上实现等于的人。因此,它们不是一回事
一个常见的例子是字符串,其中两个不同的实例可能具有相同的内容(相同的字符串),在这种情况下,=
比较为false,但等于
返回true
equals
(在Object
上)的默认实现在内部使用了=
,因此对于不覆盖equals
的对象(当然不包括空值)这与泛型有什么关系?我刚刚意识到,没有什么是一般的经验法则,您不应该使用==和!=除基元类型外的任何对象上的运算符。有关解释,请参见Oli和Matti的答案。