Last active
April 14, 2020 09:25
-
-
Save qqyycom/51fd0b35b9edf5e4d605d6e2a3b41366 to your computer and use it in GitHub Desktop.
resize方法 jdk8
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// hashmap的扩容方法 | |
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; | |
} | |
// 2倍 | |
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; | |
// & oldCap 判断最高位(cap位2的幂次), 最高位是0 保留在原来的桶, 否则, 添加到新增的桶里 | |
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; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment