【问题标题】:Java HashMap mechanism [duplicate]Java HashMap 机制 [重复]
【发布时间】:2013-03-04 10:32:49
【问题描述】:

在 Java 中,如果我有 HashMap<Integer, int[]> map 并想查找给定的 int key,例如 map.get(key),那么算法将计算 key.hashCode(),转到相应的存储桶并线性搜索 int[] 类型的对象并使用 equals() 比较它们?因此,桶中的那些int[] 对象将具有相同的键(由hashCode 计算),它们将由equals() 进行比较。对吗?

我在网上找不到一个例子,它显示得很清楚。只有文字。

您要重定向我的内容不包含正常可理解的示例,我不需要理论。

【问题讨论】:

标签: java hashmap


【解决方案1】:

更正: ...转到相应的存储桶并线性搜索键(整数)等于给定键的条目。这就是这个搜索在 HashMap 中的实际实现方式

final Entry<K,V> getEntry(Object key) {
    int hash = (key == null) ? 0 : hash(key);
    for (Entry<K,V> e = table[indexFor(hash, table.length)]; e != null; e = e.next) {
        Object k;
        if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k))))
            return e;
    }
    return null;
}

【讨论】:

    【解决方案2】:

    当您可以清楚地单独使用数据结构时,我认为这不是将数组混合为值的好解决方案。哈希映射的想法是相对于表压缩索引。您可以轻松地将所有整数保存在单独的数据结构中,并使用 for 循环进行枚举,并将键与 put 配对。无论引用存储在何处,此底层构造都会为您提供引用。

    【讨论】:

      【解决方案3】:

      有 2^32 个可能的哈希码,但桶的最大数量是Integer.MAX_VALUE,最大可能的 int。这意味着 HashMap必须将多个哈希码映射到同一个存储桶。

      要查找探测键(在您的情况下为整数),它首先计算探测的哈希码。它进入包含该哈希码的存储桶。它扫描桶中(键,值)对中的键,以查找其哈希码与探测哈希码匹配的键。它只对那些确实具有所需哈希码的键运行 equals 测试。

      如果它找到一个 (key, value) 对,其键等于探测,它会返回该值,在您的情况下是一个 int[] 引用。

      有关处理 null 的详细信息,请参阅@Evgeniy 的答案中引用的代码。

      【讨论】:

      • 但是一个桶里面的所有key都是一样的,不是吗?这就是为什么我忍受周围没有例子的原因。我只是不明白。
      • 不,存储桶包含 所有(键、值)对,其键的哈希码属于分配给该存储桶的一组哈希码。跨度>
      猜你喜欢
      • 1970-01-01
      • 2014-12-17
      • 1970-01-01
      • 2012-04-22
      • 2020-11-30
      • 2018-01-02
      • 2011-12-24
      • 1970-01-01
      • 2015-02-05
      相关资源
      最近更新 更多