友情提示:本文推理结果是不准确的,因为在HashMap中处于数组同一位置的元素的哈希值大部分情况是不同的,但整个思考过程比较完整,有兴趣的可以看看。
话不多说,我们直接看HashMap的resize方法源码:
重点在715-744行,我直接说结论,我会用一行代码去替换掉这近30行,如下:
newTab[e.hash & (newCap - 1)] = e;
你可能看出来了,这和上面的 e.next == null 判断之后的操作是一样的,所以可以直接将这2个判断合并,重写之后的resize方法如下:
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 ((new