You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何两个不同的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:

  1. 第一个 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
  2. 第二个 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 17:42:06