Он не зависит от указанного номера хеш-кода, т. Е. 7, и, скорее всего, ваш код является константой, вызывающей его.Вот почему:
Я просмотрел исходный код метода put в HashMap, и есть константа TREEIFY_THRESHOLD
, которая решает, когда преобразовывать обычное ведро в дерево.
staticfinal int TREEIFY_THRESHOLD = 8;
Ниже приведен фрагмент кода метода put (метод Put вызывает метод putVal):
.
.
.
for (int binCount = 0; ; ++binCount) {
if ((e = p.next) == null) {
p.next = newNode(hash, key, value, null);
if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
treeifyBin(tab, hash);
break;
}
.
.
.
Обратите внимание на строку, содержащую if (binCount >= TREEIFY_THRESHOLD - 1)
состояние.Как только он обнаруживает, что емкость заполнена до TREEIFY_THRESHOLD
, он вызывает метод treeifyBin()
.
Этот метод, в свою очередь, вызывает метод resize()
только тогда, когда встречается MIN_TREEIFY_CAPACITY
.
final void treeifyBin(Node<K,V>[] tab, int hash) {
int n, index; Node<K,V> e;
if (tab == null || (n = tab.length) < MIN_TREEIFY_CAPACITY)
resize();
else if ((e = tab[index = (n - 1) & hash]) != null) {
TreeNode<K,V> hd = null, tl = null;
do {
TreeNode<K,V> p = replacementTreeNode(e, null);
if (tl == null)
hd = p;
else {
p.prev = tl;
tl.next = p;
}
tl = p;
} while ((e = e.next) != null);
if ((tab[index] = hd) != null)
hd.treeify(tab);
}
}
Найдите приведенное выше условие во фрагменте выше
if (tab == null || (n = tab.length) < MIN_TREEIFY_CAPACITY)
resize();
Метод изменения размера затем увеличит размер карты соответственно на основе нескольких условных проверок, которые у него есть.Это в основном увеличивает емкость на коэффициент загрузки.
Точно так же, как treeify, если нет.элементов в дереве уменьшите.Операция Untreeify выполняется с использованием UNTREEIFY_THRESHOLD
, то есть 6. В качестве базы.
Я ссылался на эту ссылку для прохождения кода Hashmap.