外观
==、equals 和 hashCode,为什么会影响设备去重?
标准回答
对对象来说,== 比较是不是同一个对象;equals 比较你定义的“业务上算不算相同”。HashMap、HashSet 先利用哈希定位,再判断相等,所以重写 equals 时通常必须一起重写 hashCode。
- equals 应满足自反、对称、传递、一致,并对 null 返回 false。
- 相等必有相同 hashCode;相同 hashCode 不保证相等。
- 优先使用稳定的设备 ID 作为键,别用温度、电量等可变属性定义身份。
通俗例子
同一台设备被发现两次,产生两个 Device 对象。它们不是同一个对象,但 deviceId 都是 A17。如果相等规则按 deviceId 定义,集合就能识别重复设备;放进去以后再改 deviceId,查找可能出问题。
深入解释
**相等规则由谁决定:**Object 默认相等判断看对象身份;业务类可重写 equals,定义为设备 ID 等稳定字段相等。HashMap 会利用 hashCode 定位候选,再按相等规则匹配。
**为什么不能改键的身份:**键放入集合时按当时的哈希位置存储,后来改了用于计算哈希的字段,查找却可能去另一个位置,所以会出现“明明放进去却找不到”。
易混淆点
String 的 == 也比较引用,字符串池可能让错误写法偶尔看起来正确。
参考资料
内容来源
- Android · AI Agent 知识手册 · 原条目
job-J02