每日科普 · 2026-09-12 周六
考研 408 × 求职面试
知识点 · Java · 基础
== 与 equals 的区别及与 hashCode 的关系
1. ==:对基本类型比较的是值,对引用类型比较的是内存地址(是否同一个对象)。
2. equals:是 Object 的方法,默认实现就是 ==(比较地址)。多数类如 String、Integer 重写了它,改为比较内容是否相等。重写 equals 通常要满足自反、对称、传递、一致性,且 x.equals(null) 恒为 false。
3. hashCode:返回对象的哈希值,用于 HashMap、HashSet 等哈希容器定位桶位置。
4. 契约关系:若 a.equals(b) 为 true,则 a.hashCode() 必须等于 b.hashCode();但 hashCode 相同,equals 不一定为 true(哈希冲突)。
5. 因此重写 equals 必须同时重写 hashCode,否则两个内容相等的对象哈希值不同,会被存进不同的桶,导致 HashSet 出现重复元素、HashMap 用新对象取不到旧值。反之只重写 hashCode 不重写 equals 也不对。
每日一题 · Java
== 与 equals 的区别及与 hashCode 的关系
以下说法正确的是( )
A. 两个对象 hashCode 相同,则 equals 一定返回 true
B. 重写 equals 后可以不重写 hashCode
C. 两个对象 equals 为 true,则它们的 hashCode 一定相同
D. == 与 equals 对所有引用类型的比较结果永远一致
解析
选 C。A 错,hashCode 相同只是落到同一个桶,仍可能是哈希冲突,equals 未必为真;B 错,违反 hashCode 契约,会让 HashSet、HashMap 行为异常,如内容相同的对象被当作两个元素;C 对,这是 equals 与 hashCode 的核心契约;D 错,String 等重写了 equals,== 比地址、equals 比内容,结果常不同。
面试小贴士 · Java
== 与 equals 的区别及与 hashCode 的关系
面试官常问:为什么重写 equals 必须重写 hashCode?答:保证相等对象哈希值一致,否则哈希容器失效。易错点:只背结论,说不出 HashSet 去重、HashMap 取值的具体后果;或误答 hashCode 相同则 equals 必为真。