外观
如何理解equals、hashCode 与 HashMap?
标准回答
equals 定义对象相等关系,hashCode 用于缩小哈希查找范围。相等对象必须拥有相同哈希值,但哈希相同不代表相等。HashMap 冲突处理会继续判断键是否相等;它不保证遍历顺序,也不是线程安全容器。
作为键的字段在放入后变化,会使后续查找沿新的哈希位置搜索而找不到原记录。更适合使用不可变 ID 或不可变值对象。字符串规范化、大小写和作用域应在定义键时明确,尤其是缓存键与幂等键。
容量、负载因子和分布影响扩容与性能。桶结构、树化阈值等属于具体 JDK / Android 实现细节,理解机制后仍应看目标运行时;不要把某个桌面 JDK 的内部阈值当作所有 Android 版本的固定契约。
追问与回答
只重写 equals 不重写 hashCode 会怎样
逻辑相等的对象可能落在不同哈希位置,使集合出现找不到或去重不符合预期;必须维持契约。
ArrayMap 是否永远比 HashMap 好
小规模内存场景可能合适,但查找和插入成本不同;按集合大小、访问频率与目标环境测量,不以类名决定优劣。
易混淆点
- 认为哈希冲突说明两个对象相等。
参考资料
内容来源
- Android 与 AI 工程 Wiki · 原条目
q193