有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java HashMap实现问题

HashMap包含一个哈希表,它是一个保存值的数组

据我所知,哈希表有一个初始大小,但在多次调用put()后,它可能会增加(取决于负载因子)

不管怎样,我想知道在更改哈希表的大小后如何找到一个值,因为我知道为了计算特定键的has代码,可以使用表的大小

例如,key*prime%size

那么它是如何工作的呢


共 (3) 个答案

  1. # 1 楼答案

    因为密钥通常用于定位您的值所在的箱子。重新分配不会影响这一点,因为所有对象都会根据新的大小重新分配到新的存储箱

  2. # 2 楼答案

    Visage大体上回答了这个问题:根据键计算的散列值通过将它们按映射的实际大小展开来映射到bucket,当映射调整大小时,所有元素将再次展开到新的bucket范围中

    然而,从Java1.4开始,在幕后发生了一些值得了解的事情。首先,在传统的散列映射中,大小理想情况下是一个素数,因为这有助于在桶的范围内更均匀地分布元素。然而,在Java1.4HashMap中,大小总是2的幂!这将使标准分布表现得非常糟糕-但是,在这个实现中,哈希值在内部使用非常快速的算法来平滑分布

    Java专家时事通讯5454b上有更多详细信息

  3. # 3 楼答案

    如果查看addEntry(..)方法的代码,您会看到:

    if (size++ >= threshold)
       resize(2 * table.length);
    

    调整大小时,调用transfer(..)方法,该方法:

    Transfers all entries from current table to newTable.