【问题标题】:How does resize works in Hash Map in Java?调整大小如何在 Java 中的 Hash Map 中工作?
【发布时间】:2019-05-11 09:08:21
【问题描述】:

这是反编译的 java 代码,该方法用于将条目放入哈希映射中。

/**
     * Implements Map.putAll and Map constructor.
     *
     * @param m the map
     * @param evict false when initially constructing this map, else
     * true (relayed to method afterNodeInsertion).
     */
    final void putMapEntries(Map<? extends K, ? extends V> m, boolean evict) {
        int s = m.size();
        if (s > 0) {
            if (table == null) { // pre-size
                float ft = ((float)s / loadFactor) + 1.0F;
                int t = ((ft < (float)MAXIMUM_CAPACITY) ?
                         (int)ft : MAXIMUM_CAPACITY);
                if (t > threshold)
                    threshold = tableSizeFor(t);
            }
            else if (s > threshold)
                resize();
            for (Map.Entry<? extends K, ? extends V> e : m.entrySet()) {
                K key = e.getKey();
                V value = e.getValue();
                putVal(hash(key), key, value, false, evict);
            }
        }
    }

这个公式是从哪里来的,它是如何工作的?

float ft = ((float)s / loadFactor) + 1.0F;

还有这个方法是什么意思

/**
 * Returns a power of two size for the given target capacity.
 */
static final int tableSizeFor(int cap) {
    int n = -1 >>> Integer.numberOfLeadingZeros(cap - 1);
    return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
}

【问题讨论】:

  • 能否指定java版本,查看tableSizeFor( cap ) - HashMap

标签: java algorithm hash hashmap


【解决方案1】:

currentSize should &lt;= capacity * loadFactor,表示当currentSize / loadFactor &gt; capacity时,我们应该调整地图大小。 +1 用于四舍五入。

当它出现时,tableSizeFor 用于:

返回给定目标容量的 2 的幂。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-30
    • 2013-03-11
    • 1970-01-01
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多