java HashMap扩容机制

jdk7源码:
//1、判断当前个数是否大于等于阈值
//2、当前存放是否发生哈希碰撞
//如果上面两个条件否发生,那么就扩容
if ((size >= threshold) && (null != table[bucketIndex])) {
    //扩容,并且把原来数组中的元素重新放到新数组中
    resize(2 * table.length);
    //...
}
Hashmap的扩容需要满足两个条件:当前数据存储的数量(即size())大小必须大于等于阈值;当前加入的数据是否发生了hash冲突。

jdk8源码:
//然后判断容量是否超过阈值,超过则扩容
if (++size > threshold){
    resize();
}
//jdk8使用链表和红黑树来保存数据,转红黑树的条件:如果数据量大于64,且某一个数组下标数据量大于8,那么该处即为红黑树

//检查当前存入位置是否已经大于链表的第8个位置,
//如果大于,调用treeifyBin方法判断是扩容还是需要将该链表转红黑树
final void treeifyBin(Node<K,V>[] tab, int hash) {
    //如果Map为空或者当前存入数据n(可以理解为map的size())的数量小于64便进行扩容
    if (tab == null || (n = tab.length) < MIN_TREEIFY_CAPACITY){
        resize();

    //如果size()大于64则将正在存入的该值所在链表转化成红黑树
    } else if ((e = tab[index = (n - 1) & hash]) != null) {
        TreeNode<K,V> hd = null, tl = null;
    }

    //....
}


           


 

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页