Java HashMap机制

时间:2013-03-15 16:06:29

标签: java hashmap

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

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

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

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

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

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