HashMap如何确保使用key的hashcode计算出的索引在可用范围内?

AKh*_*AKh 5 java algorithm hash hashmap data-structures

我浏览了 HashMap 的源代码并有几个问题。PUT 方法采用 Key 和 Value 并执行

  1. 密钥的哈希码的哈希函数。
  2. 使用上一步获得的哈希计算该对的存储桶位置

    public V put(K key, V value) {
       int hash = hash(key.hashCode());
       int i = indexFor(hash, table.length);
       .....
    }
    
    
    static int hash(int h) {
       h ^= (h >>> 20) ^ (h >>> 12);
       return h ^ (h >>> 7) ^ (h >>> 4);
    }
    
    
    static int indexFor(int h, int length) {
       return h & (length-1);
    }
    
    Run Code Online (Sandbox Code Playgroud)

例子:

  • 创建大小为 10 的 HashMap。
  • 调用 put(k,v) 三次并假设这 3 个占用存储桶 loc 7 ,8 和 9
  • 跟注第 4 个 K,V 对,并发生以下情况
    • 使用 key.hashcode() 调用 hash() 并计算哈希值
    • indexFor是根据hash计算的

问题:

  1. 如果计算出的第 4 个 k,v 的存储桶位置超出现有边界怎么办?说位置11?

预先感谢阿克

Jon*_*eet 2

对于你的第一个问题:地图总是使用 2 的幂作为大小(如果你给它的容量为 10,它实际上会使用 16),这意味着它index & (length - 1)总是在范围内[0, length),所以它总是在范围内。

目前尚不清楚你的第二个问题和第三个问题与什么有关。我认为 HashMap除非需要,否则不会重新分配一切。

  • @AKh:看一下代码 - 它只是循环遍历 2 的幂,直到找到一个至少与请求的容量一样大的值。 (2认同)