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

新手上路,请多包涵

我想澄清一下我是否理解正确:

  • == 是引用比较,即两个对象都指向同一个内存位置
  • .equals() 评估对象中值的比较

原文由 brainydexter 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 460
2 个回答

一般来说,您的问题的答案是“是”,但是……

  • .equals(...) 只会比较它所写的比较,不多也不少。
  • 如果一个类没有覆盖 equals 方法,那么它默认为覆盖该方法的最近父类的 equals(Object o) 方法。
  • 如果没有父类提供覆盖,则默认为最终父类 Object 中的方法,因此您将使用 Object#equals(Object o) 方法。根据对象 API,这与 == 相同;也就是说, 当且仅当 两个变量都引用同一个对象时,如果它们的引用是一个且相同的,它才返回 true。因此,您将测试 对象相等 而不是 功能相等
  • 如果您覆盖 --- ,请始终记住覆盖 hashCode equals 以免“违反合同”。根据 API,如果两个对象的 equals 方法表明它们是等效的,则从 hashCode() 方法返回的结果 必须 相同。反过来 不一定 是真的。

原文由 Hovercraft Full Of Eels 发布,翻译遵循 CC BY-SA 3.0 许可协议

关于 String 类:

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

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

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

我希望这可以解决一些问题。

原文由 Jacques Colmenero 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题