Как работает изменение размера в Hash Map в Java? - PullRequest
0 голосов
/ 10 декабря 2018

Вот декомпилированный код 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;
}

1 Ответ

0 голосов
/ 10 декабря 2018

currentSize should <= capacity * loadFactor, что означает, что когда currentSize / loadFactor > capacity, мы должны изменить размер карты.+1 используется для округления.

В комментариях tableSizeFor используется для:

Возвращает степень двойного размера для заданной целевой емкости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...