HashSet的扩容过程

扩容过程

一、加入节点数达到临界值

每加入一个节点Node(k,v,h,next),size就会+1,所以当加入的元素到达临界值threshold时,就会扩容

二、其中一条链表元素数量>=8

  1. 因为所有A类元素hashcode值相同,所以会被加入同一个链表
  2. 再加入8个元素之后,再加入第九个元素,table表会扩容为原来两倍,即32
  3. 再加入第九个元素,继续扩容,为64
  4. 再加入第10个元素时,因为此时的table表已经满足了容量>=64,且单条链表元素>=8,所以会进行树化,将table表化为红黑树
package aggregate.setClass;

import java.util.HashSet;

public class HashSetIncrement {
    public static void main(String[] args) {
        //测试HashMap的扩容过程
        //因为所有A类元素hashcode值相同,所以会被加入同一个链表
        //再加入8个元素之后,再加入第九个元素,table表会扩容为原来两倍,即32
        //再加入第九个元素,继续扩容,为64
        //再加入第10个元素时,因为此时的table表已经满足了容量>=64,且单条链表元素>=8,所以会进行树化,将table表化为红黑树
        
        HashSet hashSet = new HashSet();
        for (int i = 0; i <12; i++) {
            hashSet.add(new A(i));
        }
    }
}

//创建一个A类,使其所有元素返回的hashcode值固定
class A{
    private int i;

    public A(int i) {
        this.i = i;
    }

    @Override
    public int hashCode() {
        return 100;
    }
}
上一篇:HashSet 源码


下一篇:HashSet源码分析