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比较中使用的“关键域”。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZHOU_VIP

您的鼓励将是我创作最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值