JDK8 HashMap扩容算法demo
作者:子瞻
这篇文章主要为大家介绍了JDK8 HashMap扩容算法demo,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
HashMap初始化方法
HashMap() 不带参数,默认初始化大小为16,加载因子为0.75;
HashMap(int initialCapacity) 指定初始化大小;
HashMap(int initialCapacity, float loadFactor) 指定初始化大小和加载因子大小;
HashMap(Map extends K,? extends V> m) 用现有的一个map来构造HashMap。
JDK8 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; } //double之后的新容量小于2的30次方且old容量大于等于16 else if ((newCap = oldCap << 1) < MAXIMUM_CAPACITY && oldCap >= DEFAULT_INITIAL_CAPACITY) // 新的threshold double newThr = oldThr << 1; } //如果old thereshold 大于 0 else if (oldThr > 0) //旧的threshold 赋给 新的容量 newCap = oldThr; else {//进行初始化容量和阈值赋值 newCap = DEFAULT_INITIAL_CAPACITY; newThr = (int)(DEFAULT_LOAD_FACTOR * DEFAULT_INITIAL_CAPACITY); } if (newThr == 0) {//如果old容量为0, //新的阈值计算公式 float ft = (float)newCap * loadFactor; //赋值 newThr = (newCap < MAXIMUM_CAPACITY && ft < (float)MAXIMUM_CAPACITY ? (int)ft : Integer.MAX_VALUE); } //新的阈值复制到当前hashMap实例中 threshold = newThr; @SuppressWarnings({"rawtypes","unchecked"}) Node<K,V>[] newTab = (Node<K,V>[])new Node[newCap]; table = newTab; if (oldTab != null) { //遍历old数组 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; /** 设计很巧妙,整个扩容之后的数组分为两部分: 低位 高位 newCap = oldCap+扩容之后的Cap **/ //判断hash命中低位分布或者高位部分 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] newTab[j] = loHead; } if (hiTail != null) { hiTail.next = null; //将高位部分链表头节点赋值在newTab[j+oldCap] newTab[j + oldCap] = hiHead; } } } } } return newTab; }
以上就是JDK8 HashMap扩容算法demo的详细内容,更多关于JDK8 HashMap扩容算法的资料请关注脚本之家其它相关文章!