当前位置: 首页 > news >正文

Java面试题-两个对象相等equals相等吗,equals相等对象相等吗

这是一个非常经典的Java面试题,它核心考察的是你对对象相等性判断的深入理解。简单来说,这

两个说法并不总是成立,关键在于如何定义“相等”。

下面这个表格清晰地展示了它们的关系:

情形

两个对象相等 (内存地址相同)

equals方法返回 true

说明

​默认情况 (未重写 equals)​

✅ 意味着 equals为 true

❌ ​​不意味着​​ 对象相等

此时 equals等价于 ==,比较内存地址。

​重写 equals后​

❌ ​​不意味着​​ equals为 true

✅ 意味着 被​​逻辑上​​认为是相等的

此时 equals比较的是对象内容(如字段值)。


⚖️ 深入解析相等性

1. “两个对象相等” 是否意味着 equals为 true

这里的“对象相等”通常指​​两个引用指向同一个内存对象​​(即使用 ==比较为 true)。

  • ​结论:是的,必然为 true。​

  • ​原因​​:根据 equals方法的约定,其实现必须满足​​自反性​​(x.equals(x)为 true)。如果一个引用和它自己比较都不相等,那就违反了最基本的原则。即使在重写的 equals方法中,第一行检查也通常是 if (this == obj) return true;,用于优化性能。

2. equals为 true是否意味着“两个对象相等”?

这里的“对象相等”指​​两个引用指向同一个内存对象​​。

  • ​结论:不一定。​

  • ​原因​​:当我们重写 equals方法后,它比较的不再是内存地址,而是对象的​​逻辑内容​​。例如,两个不同的 String对象 new String("abc"),它们位于内存的不同位置(==比较为 false),但因为字符序列完全相同,equals比较会返回 true。在这种情况下,我们说它们在逻辑上是相等的,但不是同一个对象。

🔗 equals与 hashCode的黄金法则

这是一个​​至关重要​​的关联规则:​​当你重写了 equals方法,你必须同时重写 hashCode方法​​。

  • ​规则​​:如果两个对象根据 equals方法是相等的,那么调用它们的 hashCode方法必须产生相同的整数结果。

  • ​为何重要​​:这条规则主要是为了保障基于哈希表的集合类(如 HashMapHashSetHashtable)能正常工作。这些集合依赖 hashCode来快速定位对象。

  • ​违反后果​​:如果两个对象 equals相等但 hashCode不相等,它们可能会被插入到哈希表的不同位置,导致你无法正常地从集合中检索到该对象,甚至可能使集合中存在重复元素(违反 Set的唯一性)。

💡 面试进阶要点

  1. equals的五大原则​​:

    • ​自反性​​:x.equals(x)必须返回 true

    • ​对称性​​:如果 x.equals(y)为 true,那么 y.equals(x)也必须为 true

    • ​传递性​​:如果 x.equals(y)为 true,且 y.equals(z)为 true,那么 x.equals(z)也必须为 true

    • ​一致性​​:只要对象没有被修改,多次调用 x.equals(y)应该始终返回相同的结果。

    • ​非空性​​:对任何非 null的 xx.equals(null)必须返回 false

  2. ==与 equals的根本区别​​:

    • ==:对于基本类型,比较的是​​值​​;对于引用类型,比较的是​​内存地址​​。

    • equals:默认行为与 ==相同,但可以被重写用于比较对象的​​逻辑内容​​。

  3. ​重写 equals和 hashCode的最佳实践​​:

    • 使用 IDE 或 java.util.Objects类的 equals和 hash方法来安全、简洁地实现。

    • 确保在 hashCode计算中使用所有在 equals比较中使用的“关键域”。

http://www.dtcms.com/a/516568.html

相关文章:

  • 网站建设汇报材料链接买卖
  • 外贸型网站该如何推广甘肃网络公司网站
  • 外国做的福利小视频在线观看网站网站建设现状调查研究
  • DevEco Studio与Web联合开发:打造鸿蒙混合应用的全景指南
  • 动力网站网站关键词优化的步骤和过程
  • Kotlin 高阶函数在回调设计中的最佳实践
  • gh-ost菜鸟教程
  • 湖南微信网站公司网页显示网站正在建设中怎么做
  • 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-27- 操作单选和多选按钮 - 上篇(详细教程)
  • 网站建设与管理培训总结网站规划有前途吗
  • 下载空excel和导出带有查询数据的excel的区别
  • 智元灵犀X1-本体通讯架构分析2:CAN/FD总线性能优化分析
  • 深圳最简单的网站建设wordpress中文名字注册
  • 软件开发的创意提案详解
  • 外贸建站 知乎深圳建设工程交易平台
  • Spring Cloud - Spring Cloud 负载均衡(Ribbon 负载均衡概述、Ribbon 使用)
  • 行业网站运营网站上可以做文字链接么
  • 通达信--报表分析
  • 做谷歌推广一定要网站吗it运维需要具备哪些能力
  • 大模型数据筛选、分类、生成任务,满足并发速度和处理准确要求
  • CentOS系统yum list使用指南
  • 社保减员要怎么做 国税局网站建设工程用地批准手续在哪个网站
  • “HTTPS 个人化”实战,个人站点与设备调试的部署、验证与抓包排查方法
  • 手机网站cms 开源中国主流媒体平台有哪些
  • 档案管理系统有什么好处?核心功能让档案管理效率提升
  • 基于MountainTop数据的STAP算法仿真实现
  • Linux驱动之USB、MIPI摄像头驱动
  • TypeScript 面试题及详细答案 100题 (71-80)-- 模块与命名空间
  • 元组练习题
  • 【文献分享】Cell Decode:利用多尺度可解释深度学习进行细胞身份解码