Skip to content
阅读进度

如何理解equals、hashCode 与 HashMap? ​

返回 Java 与并发 目录

标准回答 ​

equals 定义对象相等关系,hashCode 用于缩小哈希查找范围。相等对象必须拥有相同哈希值,但哈希相同不代表相等。HashMap 冲突处理会继续判断键是否相等;它不保证遍历顺序,也不是线程安全容器。

作为键的字段在放入后变化,会使后续查找沿新的哈希位置搜索而找不到原记录。更适合使用不可变 ID 或不可变值对象。字符串规范化、大小写和作用域应在定义键时明确,尤其是缓存键与幂等键。

容量、负载因子和分布影响扩容与性能。桶结构、树化阈值等属于具体 JDK / Android 实现细节,理解机制后仍应看目标运行时;不要把某个桌面 JDK 的内部阈值当作所有 Android 版本的固定契约。

追问与回答 ​

只重写 equals 不重写 hashCode 会怎样 ​

逻辑相等的对象可能落在不同哈希位置,使集合出现找不到或去重不符合预期;必须维持契约。

ArrayMap 是否永远比 HashMap 好 ​

小规模内存场景可能合适,但查找和插入成本不同;按集合大小、访问频率与目标环境测量,不以类名决定优劣。

易混淆点 ​

  • 认为哈希冲突说明两个对象相等。

参考资料 ​

内容来源 ​

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