Skip to content
阅读进度

==、equals 和 hashCode,为什么会影响设备去重? ​

返回 架构与 SDK 目录

标准回答 ​

对对象来说,== 比较是不是同一个对象;equals 比较你定义的“业务上算不算相同”。HashMap、HashSet 先利用哈希定位,再判断相等,所以重写 equals 时通常必须一起重写 hashCode。

  • equals 应满足自反、对称、传递、一致,并对 null 返回 false。
  • 相等必有相同 hashCode;相同 hashCode 不保证相等。
  • 优先使用稳定的设备 ID 作为键,别用温度、电量等可变属性定义身份。

通俗例子 ​

同一台设备被发现两次,产生两个 Device 对象。它们不是同一个对象,但 deviceId 都是 A17。如果相等规则按 deviceId 定义,集合就能识别重复设备;放进去以后再改 deviceId,查找可能出问题。

深入解释 ​

**相等规则由谁决定:**Object 默认相等判断看对象身份;业务类可重写 equals,定义为设备 ID 等稳定字段相等。HashMap 会利用 hashCode 定位候选,再按相等规则匹配。

**为什么不能改键的身份:**键放入集合时按当时的哈希位置存储,后来改了用于计算哈希的字段,查找却可能去另一个位置,所以会出现“明明放进去却找不到”。

易混淆点 ​

String 的 == 也比较引用,字符串池可能让错误写法偶尔看起来正确。

参考资料 ​

内容来源 ​

用完整回答理解机制,用真实证据解释项目。