(IDEA 692-700) :tableSizeFor
private static final int MAXIMUM_CAPACITY = 1 << 30;
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;
}
求出给定容量的表空间大小。(比如:参数为15,则表空间为16;参数为17,则表空间为32)
(IDEA 836-843) :构造器
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;
}
给定initialCapacity,如果小于0,则抛出异常;如果大于MAXNIMUM_CAPACITY,则等于MAXNIMUM_CAPACITY的值;如果
小于MAXNIMUM_CAPACITY,则等于initialCapacity + 1/2 * initialCapacity + 1
(IDEA 892-902):构造器
public ConcurrentHashMap(int initialCapacity,
float loadFactor, int concurrencyLevel) {
if (!(loadFactor > 0.0f) || initialCapacity < 0 || concurrencyLevel <= 0)
throw new IllegalArgumentException();
if (initialCapacity < concurrencyLevel) // Use at least as many bins
initialCapacity = concurrencyLevel; // as estimated threads
long size = (long)(1.0 + (long)initialCapacity / loadFactor);
int cap = (size >= (long)MAXIMUM_CAPACITY) ?
MAXIMUM_CAPACITY : tableSizeFor((int)size);
this.sizeCtl = cap;
}
如果loadFactor 小于等于 0或者initialCapacity小于0或者并发级别小于等于0,则抛出异常
如果initialCapacity小于并发级别,则initialCapacity等于并发级别
表空间大小为initialCapacity / loadFactor + 1,再去跟MAXIMUM_CAPACITY比较,如果大于MAXIMUM_CAPACITY,则表空间大小等于MAXIMUM_CAPACITY,反之通过tableSizeFor计算实际的表空间大小。