ConcurrentHashMap 详解

private static final int MAXIMUM_CAPACITY = 1 << 30;

  • MAXIMUM_CAPACITY是2的30次方 的原因`
    1. int的最大的值是2的31次方-1,所以容量无法到达2的31次方,
    2. 需要让容量满足2的幂次,所以设置为2的30次方

private static final int DEFAULT_CAPACITY = 16;

  • DEFAULT_CAPACITY = 16;
    1. 方便数据迁移
    2. 方便进行计算对应的位置
    3. 概率统计

new ConcurrentHashMap<>(2); 自定义大小解释:

1
2
3
4
5
6
7
8
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;
}
1
2
3
4
5
6
7
8
9
10
// tableSizeFor的功能(不考虑大于最大容量的情况)是返回大于输入参数且最近的2的整数次幂的数。比如10,则返回16。 
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;
}