Java 中的 == 和 equals() 有什么区别?

2022-08-31 04:06:11

我想澄清一下我是否正确地理解了这一点:

  • ==是参考比较,即两个对象都指向相同的内存位置
  • .equals()计算对象中值的比较

答案 1

一般来说,你的问题的答案是“是的”,但是...

  • .equals(...)只会比较它所写的内容来比较,不多也不少。
  • 如果某个类不重写 equals 方法,则它默认为已重写此方法的最接近的父类的方法。equals(Object o)
  • 如果没有父类提供重写,则它默认为最终父类 Object 中的方法,因此您只能使用该方法。根据对象 API,这与 ;也就是说,当且仅当两个变量都引用同一个对象时,如果它们的引用是同一个对象,则返回 true。因此,您将测试对象相等性,而不是功能相等性Object#equals(Object o)==
  • 始终记住,如果您覆盖,请覆盖,以免“破坏合同”。根据 API,如果两个对象的方法显示它们是等效的,则从该方法返回的两个对象的结果必须相同。反之亦然。hashCodeequalshashCode()equals

答案 2

关于 String 类:

equals() 方法比较 String 实例(堆上)内的“值”,而不考虑两个对象引用是否引用同一个 String 实例。如果任何两个 String 类型的对象引用引用相同的 String 实例,那就太好了!如果两个对象引用引用两个不同的 String 实例。这没有什么区别。它是正在比较的每个 String 实例内的“值”(即:字符数组的内容)。

另一方面,“==”运算符比较两个对象引用的值,以查看它们是否引用同一 String 实例。如果两个对象的值都引用“引用”同一个 String 实例,则布尔表达式的结果将为“true”。嘟嘟。另一方面,如果两个对象引用的值“引用”不同的 String 实例(即使两个 String 实例具有相同的“值”,即每个 String 实例的字符数组的内容相同),则布尔表达式的结果将为“false”。

与任何解释一样,让它沉浸其中。

我希望这能把事情弄清楚一点。