为何两个不同的Java HashMap实例会返回相同的hashCode值?
Java HashMap hashCode 相同的原因解释
首先要明确:hashCode 的设计目标不是保证绝对唯一,Java 语言规范只要求:
- 相等的对象(
equals()返回true)必须拥有相同的 hashCode - 但 hashCode 相同的对象,不一定相等(这就是所谓的「哈希碰撞」,是正常且允许的现象)
HashMap 的 hashCode 计算规则
Java 中 HashMap 的 hashCode 是通过遍历所有键值对,将每个键值对的哈希值相加得到的。单个键值对的哈希值计算方式为:
entry.hashCode() = key.hashCode() ^ value.hashCode()
最终 HashMap 的 hashCode 是所有 entry 的 hashCode 之和。
你的案例具体计算
我们来拆解你提到的两个 HashMap:
第一个 HashMap:
{u=0, h=3}- 键
'u'的 hashCode 是 ASCII 码 117,值0的 hashCode 是 0 →117 ^ 0 = 117 - 键
'h'的 hashCode 是 ASCII 码 104,值3的 hashCode 是 3 →104 ^ 3 = 107 - 总和:
117 + 107 = 224
- 键
第二个 HashMap:
{t=3, i=0}- 键
't'的 hashCode 是 ASCII 码 116,值3的 hashCode 是 3 →116 ^ 3 = 119 - 键
'i'的 hashCode 是 ASCII 码 105,值0的 hashCode 是 0 →105 ^ 0 = 105 - 总和:
119 + 105 = 224
- 键
可以看到,两组不同的键值对,各自的 entry 哈希值相加后刚好得到相同的结果,这就是它们 hashCode 相同的原因。
总结
哈希碰撞是哈希算法中不可避免的情况,只要两个对象的 equals() 返回 false,即使 hashCode 相同,也不会影响 Java 集合(比如 HashMap 本身)的正常工作——因为集合判断元素是否相等时,会同时检查 hashCode 和 equals() 方法。
内容的提问来源于stack exchange,提问作者Anguraj Dinesh
相关产品推荐
相关产品推荐

