极限情况下,向hashMap中放置多少条数据,会形成红黑二叉树?

JDK1.8 HashMap底层数据结构增加一种红黑二叉树,在极限情况下11条变成红黑二叉树。
JDK1.8 HashMap底层数据结构增加一种红黑二叉树。
11条8(16) => 9(162=>32) => 10(322=>64) => 11(Tree)。
因为在put的时候会调用putVal,而putVal在往链表里面插入数据的时候会有这样一段代码

if (binCount >= TREEIFY_THRESHOLD - 1) {
     // -1 for 1st  真的插入链表元素后, 判断元素个数是否到达上限
	treeifyBin(tab, hash); // 把此位置的所有元素重新插入成一个红黑树
}

在treeifyBin会有这样的判断

if (tab == null || (n = tab.length) < MIN_TREEIFY_CAPACITY) //判断数据的长度是否小于64
	resize();

也就是说当一个数组索引下的链表长度大于等于7的时候会转化为红黑树调用treeifyBin方法,但是在真正的转化为红黑树之前会判断是否因为数组的长度不够才导致一个索引的元素过多,因此会有2次扩容32和64。当数组到了64的时候会将该数组索引下的链表变成红黑树。也就是说在第一次扩容的时候该数组索引下的链表元素为9,数组长度扩容为32。然后继续在该索引下存放元素,此时数组扩容为64,元素个数为10。当再次存放元素的时候也就是11条数据的时候并且数组长度为64了,因此需要将该索引下面的链表变成红黑树。

下面举一个极限状态下扩容

class Stu{
     
    //我们规定就往HashMap的table1里面放数据
    @Override
    public int hashCode() {
     
        return 1;
    }

    @Override
    public boolean equals(Object obj) {
     
        return false;
    }
}

public static void main(String[] args) {
     
    Map<Stu, Stu> map = new HashMap<Stu, Stu>();
    for (int i = 1; i < 20; i++) {
     
        Stu stu = new Stu();
        map.put(stu, stu);
        System.out.println("i = " + i);
    }
}

在idea里面调试的时候注意设置setting->Build,Execution,Deployment -> Debugger->Data Views->Java
我是这样设置的
极限情况下,向hashMap中放置多少条数据,会形成红黑二叉树?_第1张图片
接下来调试分析
极限情况下,向hashMap中放置多少条数据,会形成红黑二叉树?_第2张图片
我们发现所有数据都在table1里面,其他数组的数据都是null,并且可以发现在插入第10个数据的时候还是链表,当再次插入第11个数据数据的时候就会变成下面情况,
极限情况下,向hashMap中放置多少条数据,会形成红黑二叉树?_第3张图片
变成了红黑二叉树。因此极限情况下存放11条数据的时候就会变成红黑二叉树。
总结:
所以当链表元素数目到8个,同时HashMap的数组长度要大于64,链表才会转红黑树,否则都是做扩容。

你可能感兴趣的:(大数据,hadoop)