当前位置: 首页 > 知识库问答 >
问题:

HashMap如何确保使用密钥的哈希码计算的索引在可用范围内?

龙浩博
2023-03-14

我浏览了HashMap的源代码,并提出了一些问题。PUT 方法采用键和值并执行

>

  • 密钥哈希码的哈希函数。
  • 使用从上一步获得的哈希计算这对的桶位置

    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);
    }
    

    例:

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

      问题:

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

      提前谢谢,Akh

  • 共有3个答案

    谢弘阔
    2023-03-14

    让我们更详细地讨论,hashmap如何初始化bucket大小?

    以下代码来自HashMap.java

    而(i

    如果您通过初始10,则上述代码用于使功率大小为2。因此使用上述代码HashMap初始化存储桶大小16;

    以下代码用于计算存储桶索引,

    static int indexFor(int h, int length) {
            return h & (length - 1);
        }
    
    子车峰
    2023-03-14

    哈希地图通常会使用哈希代码来修改存储桶的数量。发生冲突时会发生什么取决于实现(不确定Java的哈希图)。有两种基本策略:保留落在存储桶中的项目列表,或者如果您的存储桶已满,则向前跳到其他存储桶。我的猜测是哈希地图使用列表存储桶方法。

    孟泽宇
    2023-03-14

    对于你的第一个问题:地图总是使用2的幂作为大小(如果你给它一个容量10,它实际上将使用16),这意味着索引

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

     类似资料:
    • 问题内容: 现在,Amazon Product API在我尝试生成ushing Python的每个请求中都需要签名。 我挂断的步骤是这一步: “使用上面的字符串与我们的“虚拟”秘密访问密钥:1234567890,使用SHA256哈希算法计算符合RFC 2104的HMAC。有关此步骤的更多信息,请参见编程语言的文档和代码示例。” 给定字符串和私钥(在本例中为1234567890),如何使用Pytho

    • 如果我在hashmap中输入一个键和值,并且基于键hashcode生成的索引大于15,并且映射大小仍然小于阈值(即12),会发生什么? 提前谢谢。

    • 当人们说Hashmap比列表更快时,我对Hashmap或Hashtable的概念更困惑。我很清楚散列的概念,其中的值存储在给定密钥的散列代码中。 但是,当我想检索数据时,例如,它是如何工作的,我在一个HashMap中存储n个带有n个不同键的字符串。如果我想检索与特定键关联的特定值,它将如何在O(1)的时间内返回它?因为散列密钥将与所有其他密钥进行比较,对吗?

    • 我刚刚讨论了散列码的概念,遇到了一行:

    • 问题内容: 我有一个哈希表,其键的模式为USER_TEL,例如: 现在,我想获取密钥中具有相同TEL的所有用户的地址。 我想出的是: 我得到而不是价值观。 问题答案: 您应该使用HSCAN命令。 例如: 更新资料 Python实现:

    • keytool-exportcert-alias diego-keystore“c:\users\diego\desktop\celuchat.keystore”“c:\openssl\bin\openssl.exe”sha1-binary“c:\openssl\bin\openssl.exe”base64 celuchat.keystore是我在导出签名的应用程序时使用的密钥库,当keytool