Зачем использовать поле `threshold` для хранения начальной емкости вместо дополнительного поля, такого как 'initialCapacity`, которое более понятно? - PullRequest
1 голос
/ 23 апреля 2019

Конструктор HashMap

/**
 * Constructs an empty <tt>HashMap</tt> with the specified initial
 * capacity and load factor.
 *
 * @param  initialCapacity the initial capacity
 * @param  loadFactor      the load factor
 * @throws IllegalArgumentException if the initial capacity is negative
 *         or the load factor is nonpositive
 */
public HashMap(int initialCapacity, float loadFactor) {
    if (initialCapacity < 0)
        throw new IllegalArgumentException("Illegal initial capacity: " +
                initialCapacity);
    if (initialCapacity > MAXIMUM_CAPACITY)
        initialCapacity = MAXIMUM_CAPACITY;
    if (loadFactor <= 0 || Float.isNaN(loadFactor))
        throw new IllegalArgumentException("Illegal load factor: " +
                loadFactor);
    this.loadFactor = loadFactor;
    this.threshold = tableSizeFor(initialCapacity); // here, threadshold is actually initial capacity
}

Я немного запутался при чтении кода.Мой вопрос заключается в том, почему использовать поле threshold для хранения начальной емкости вместо дополнительного поля, такого как initialCapacity, что более понятно?


Редактировать: я не заметил, что конструктор принимает параметр initialCapacity, Я думаю, что параметр конструктора initialCapacity должен быть specifiedInitialCapacity.

1 Ответ

0 голосов
/ 23 апреля 2019

Потому что HashMaps растут более одного раза, а порог является динамическим значением.Он изменяется в течение жизненного цикла карты и адаптируется при каждом изменении размера карты.

Javadoc для threshold (1.8 openjdk):

/**
 * The next size value at which to resize (capacity * load factor).
 *
 * @serial
 */
// (The javadoc description is true upon serialization.
// Additionally, if the table array has not been allocated, this
// field holds the initial array capacity, or zero signifying
// DEFAULT_INITIAL_CAPACITY.)
int threshold;

Поскольку размер карты можно изменить,начальная емкость как раз такая, и порог изначально такой же.

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