不重写 hashCode 会导致 HashMap 将逻辑相同的 key 视为不同对象:存得进、取不出(get 返回 null)、删不掉、且允许重复插入;根本原因是查找时先用 hashCode 定位桶,再用 equals 精确匹配,而默认 hashCode 基于内存地址,使相同业务数据散列到不同桶,equals 无法触发。

不重写 hashCode,HashMap 会把逻辑上“相同”的 key 当作完全不同的对象处理——存得进、取不出、删不掉、还可能重复插入。
查不到值:get() 永远返回 null
比如两个 Person("张三", 25) 实例 p1 和 p2,字段一模一样。但没重写 hashCode 时,它们的哈希值来自内存地址(如 0x100 和 0x200)。put(p1, "admin") 存进了桶 0x100 对应的位置;而 get(p2) 却去查桶 0x200,自然找不到,返回 null。
重复插入:同一个业务 key 被当成多个 key
HashMap 不会阻止你反复 put 相同业务含义的 key。因为每次计算出的哈希值不同,它们被散列到不同桶里,equals 根本不会被调用。结果是 map 里出现多条“重复”记录,比如:
map.put(new OrderKey("ORD-001", "tenant-a"), 100);map.put(new OrderKey("ORD-001", "tenant-a"), 200);
这两条都会成功,size 变成 2,而不是覆盖为 1。
remove 失败:删不掉本该存在的键
remove(p2) 同样按 p2 的哈希值去找桶,和 put(p1) 不在一个位置,所以删不掉已存的值。即使你手握完全相同的字段构造的新对象,只要哈希值不对,就等于“找错房间”。
根本原因:HashMap 查找依赖两步严格配合
第一步靠 hashCode() 定位桶(数组下标);第二步才在桶内用 equals() 做精确比对。没重写 hashCode(),第一步就走偏了,第二步压根没机会执行。这不是 bug,是设计逻辑使然——它只认哈希值,不认业务语义。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











