两个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的答案。