两个Java运算符之间的区别:!=与!equals

4

这段代码是:

elem1!=elem2

等同于这一个?

!elem1.equals(elem2)

它可以双向编译,但我仍不确定...


10
这与泛型有什么关系? - Michael Borgwardt
我刚意识到什么都没有,哈哈 - bluehallu
作为一个经验法则,你不应该在除了原始类型以外的任何东西上使用 == 和 != 运算符。请参考 Oli 和 Matti 的答案以获取解释。 - Mike Baranczak
2个回答

8

==(以及扩展的!=)检查对象标识,即这两个对象是否引用同一个实例。equals检查更高级别的标识概念,通常是对象的“值”是否相等。这意味着由实现equals的人决定它的含义,因此它们不是相同的东西。

这两者不同的一个常见例子是字符串,其中两个不同的实例可能具有相同的内容(相同的字符串),在这种情况下,==比较为false,但equals返回true。

equals的默认实现(在Object上)内部使用==,因此对于未覆盖equals的对象,结果将相同(当然除了null)。


7
一般来说,它们并不相同。第一个版本检查elem1elem2是否是指向同一对象的引用(假设它们不是原始类型)。第二个版本调用类型特定的方法来检查两个(可能不同的)对象在某种意义上是否“相等”(通常,这只是检查它们的所有成员字段是否相同)。我认为这与泛型没有关系。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接