帮我注释一下java HashMap的resize方法
时间: 2023-03-20 22:01:51 浏览: 121
当HashMap的元素数量超过了它的容量与负载因子的乘积时,就会调用resize方法进行扩容。扩容后,HashMap中的所有元素都需要重新计算其在新数组中的位置,并存储到新的数组中。
下面是resize方法的代码注释:
```java
/**
* 扩容HashMap,重新分配内存空间并重新计算每个元素的位置
* @param newCapacity 新的容量
*/
final void resize(int newCapacity) {
// 保存旧的数组
Node<K,V>[] oldTab = table;
// 获取旧的容量
int oldCap = (oldTab == null) ? 0 : oldTab.length;
// 如果旧的容量已经达到最大值,则无法继续扩容
if (oldCap == MAXIMUM_CAPACITY) {
threshold = Integer.MAX_VALUE;
return;
}
// 计算新的阈值
int newThr = (oldCap > 0) ? (int)(oldCap * loadFactor) : initialCapacity;
// 如果新的阈值小于最小阈值,则将新的阈值设置为最小阈值
if (newThr < MINIMUM_CAPACITY) {
newThr = MINIMUM_CAPACITY;
}
// 创建新的数组
@SuppressWarnings({"rawtypes","unchecked"})
Node<K,V>[] newTab = (Node<K,V>[])new Node[newCapacity];
// 更新阈值
threshold = newThr;
// 将HashMap的table指向新的数组
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 & (newCapacity - 1)] = e;
}
// 如果当前节点有下一个节点,则需要遍历该链表,并将链表中的所有节点放置到新数组中对应的位置上
else if (e instanceof TreeNode) {
((TreeNode<K,V>)e).split(this, newTab, j, oldCap);
}
else { // 该链表中的节点数小于等于TREEIFY_THRESHOLD(默认为8),则将该链表转换为普通链表
Node<K,V> loHead = null, loTail = null;
Node<K,V> hiHead = null, hiTail = null;
Node<K,V> next;
do {
next = e.next;
// 如果节点的哈希值在旧数组中的位置为j,则将该节点放置在新数组中的位置上,否则放置在新数组中的位置(j+oldCap)上
if ((e.hash & oldCap)
阅读全文