关于hashmap扩容问题

年轻的猴 2021-01-04 09:52:38
现在一脸混乱。。。现在说jdk8的情况。。
大概有两个问题想问:
1、就是桶不超过64,但是桶长超过了8,此时是直接硬塞进去,是把。
2、桶数量超过了(扩容因子x容量)就会扩容成两倍,直到64,此后桶不在扩容,
然后此时如果桶内元素超过8就直接把桶内的链表结构改成红黑树结构。
...全文
2630 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
一个帅逼 2021-01-05
  • 打赏
  • 举报
回复
引用 2 楼 qq_39936465 的回复:
[quote=引用 楼主 年轻的猴 的回复:]现在一脸混乱。。。现在说jdk8的情况。。 大概有两个问题想问: 1、就是桶不超过64,但是桶长超过了8,此时是直接硬塞进去,是把。 2、桶数量超过了(扩容因子x容量)就会扩容成两倍,直到64,此后桶不在扩容, 然后此时如果桶内元素超过8就直接把桶内的链表结构改成红黑树结构。
我是没看懂你想说问啥,看下图理解一下 [/quote]这个图也描述的不太正确,链表长度到达8,还有一个条件是数组长度要到达64才会树化,不然只会扩容
qq_39936465 2021-01-05
  • 打赏
  • 举报
回复
引用 楼主 年轻的猴 的回复:
现在一脸混乱。。。现在说jdk8的情况。。 大概有两个问题想问: 1、就是桶不超过64,但是桶长超过了8,此时是直接硬塞进去,是把。 2、桶数量超过了(扩容因子x容量)就会扩容成两倍,直到64,此后桶不在扩容, 然后此时如果桶内元素超过8就直接把桶内的链表结构改成红黑树结构。
我是没看懂你想说问啥,看下图理解一下
八爻老骥 2021-01-05
  • 打赏
  • 举报
回复
看看源码就知道了


/**
* Initializes or doubles table size. If null, allocates in
* accord with initial capacity target held in field threshold.
* Otherwise, because we are using power-of-two expansion, the
* elements from each bin must either stay at same index, or move
* with a power of two offset in the new table.
*
* @return the table
*/
final Node<K,V>[] resize() {
Node<K,V>[] oldTab = table;
int oldCap = (oldTab == null) ? 0 : oldTab.length;
int oldThr = threshold;
int newCap, newThr = 0;
if (oldCap > 0) {
if (oldCap >= MAXIMUM_CAPACITY) {
threshold = Integer.MAX_VALUE;
return oldTab;
}
else if ((newCap = oldCap << 1) < MAXIMUM_CAPACITY &&
oldCap >= DEFAULT_INITIAL_CAPACITY)
newThr = oldThr << 1; // double threshold
}
else if (oldThr > 0) // initial capacity was placed in threshold
newCap = oldThr;
else { // zero initial threshold signifies using defaults
newCap = DEFAULT_INITIAL_CAPACITY;
newThr = (int)(DEFAULT_LOAD_FACTOR * DEFAULT_INITIAL_CAPACITY);
}
if (newThr == 0) {
float ft = (float)newCap * loadFactor;
newThr = (newCap < MAXIMUM_CAPACITY && ft < (float)MAXIMUM_CAPACITY ?
(int)ft : Integer.MAX_VALUE);
}
threshold = newThr;
@SuppressWarnings({"rawtypes","unchecked"})
Node<K,V>[] newTab = (Node<K,V>[])new Node[newCap];
table = newTab;
if (oldTab != null) {
for (int j = 0; j < oldCap; ++j) {
Node<K,V> e;
if ((e = oldTab[j]) != null) {
oldTab[j] = null;
if (e.next == null)
newTab[e.hash & (newCap - 1)] = e;
else if (e instanceof TreeNode)
((TreeNode<K,V>)e).split(this, newTab, j, oldCap);
else { // preserve order
Node<K,V> loHead = null, loTail = null;
Node<K,V> hiHead = null, hiTail = null;
Node<K,V> next;
do {
next = e.next;
if ((e.hash & oldCap) == 0) {
if (loTail == null)
loHead = e;
else
loTail.next = e;
loTail = e;
}
else {
if (hiTail == null)
hiHead = e;
else
hiTail.next = e;
hiTail = e;
}
} while ((e = next) != null);
if (loTail != null) {
loTail.next = null;
newTab[j] = loHead;
}
if (hiTail != null) {
hiTail.next = null;
newTab[j + oldCap] = hiHead;
}
}
}
}
}
return newTab;
}

年轻的猴 2021-01-05
  • 打赏
  • 举报
回复
没。我的意思就是一直扩容到64为止,我知道初始16
KeepSayingNo 2021-01-05
  • 打赏
  • 举报
回复
桶的数量初始值是16,不是64把,其他理解是对的

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧