1.无参
什么都没做
public class ConcurrentHashMap<K,V> extends AbstractMap<K,V>implements ConcurrentMap<K,V>, Serializable {private static final float LOAD_FACTOR = 0.75f;public ConcurrentHashMap() {}
}
2.带初始容量
tableSizeFor方法的实现跟HashMap一样,但是在传递参数的时候,
参数变成了initialCapacity + (initialCapacity >>> 1) + 1)
假设initialCapacity=32,那么传给tableSizeFor是32+16+1=49,那tableSizeFor返回的就是64,而不是像HashMap会返回32。
计算的初始容量赋值给sizeCtl
public class ConcurrentHashMap<K,V> extends AbstractMap<K,V>implements ConcurrentMap<K,V>, Serializable {public ConcurrentHashMap(int initialCapacity) {if (initialCapacity < 0){throw new IllegalArgumentException();}int cap = ((initialCapacity >= (MAXIMUM_CAPACITY >>> 1)) ?MAXIMUM_CAPACITY :tableSizeFor(initialCapacity + (initialCapacity >>> 1) + 1));this.sizeCtl = cap;}private static final int tableSizeFor(int c) {int n = c - 1;n |= n >>> 1;n |= n >>> 2;n |= n >>> 4;n |= n >>> 8;n |= n >>> 16;return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;}
}
3.sizeCtl的含义
- sizeCt1为0:代表数组未初始化,且数组的初始容量为16;
- sizeCt1为正数:如果数组未初始化,那么其记录的是数组的初始容量;如果数组已经初始化,那么其记录的是数组的扩容阈值(数组的初始容量*0.75);
- sizeCtl为-1:表示数组正在进行初始化;
- sizeCt1小于0,并且不是-1:表示数组正在扩容,-(1+n),表示此时有n个线程正在共同完成数组的扩容操作;