1

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

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

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

4

3 回答 3

2

更正: ...转到相应的存储桶并线性搜索键(整数)等于给定键的条目。这就是这个搜索在 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;
}
于 2013-03-15T16:10:16.567 回答
0

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

于 2013-03-15T16:12:08.170 回答
0

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

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

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

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

于 2013-03-15T16:27:34.093 回答