public ConcurrentHashMap(int initialCapacity, float loadFactor, int concurrencyLevel) { int sshift = 0; int ssize = 1; //找到一个大于或等于concurrencyLevel 的一个 //2的幂次方数 while (ssize < concurrencyLevel) { ++sshift; ssize <<= 1; } //前面用于取hashcode的高位进行运算 this.segmentShift = 32 - sshift; this.segmentMask = ssize - 1; if (initialCapacity > MAXIMUM_CAPACITY) initialCapacity = MAXIMUM_CAPACITY; //确定HahsEntry数组的长度 int c = initialCapacity / ssize; //下面除可能造成了“向下取整”,而这里要“向上取整” //所以进行以下判断进行+1 if (c * ssize < initialCapacity) ++c; //MIN_SEGMENT_TABLE_CAPACITY 默认为2, //即HashEntry数组最小长度为2 int cap = MIN_SEGMENT_TABLE_CAPACITY; //这里同样是找一个大于等于c的一个2的幂次方数 //cap就是HashEntry对象的容量 while (cap < c) cap <<= 1; // create segments and segments[0] //创立一个Segment s0对象寄存在Segment数组下标为0的 //地位,便于前面寄存元素不必再从新计算HahsEntry //的容量等属性(原型设计思维) Segment<K,V> s0 = new Segment<K,V>(loadFactor, (int)(cap * loadFactor), (HashEntry<K,V>[])new HashEntry[cap]); Segment<K,V>[] ss = (Segment<K,V>[])new Segment[ssize]; //将s0写入ss数组地址为SBASE的地位(就是下标为0) UNSAFE.putOrderedObject(ss, SBASE, s0); // ordered write of segments[0] this.segments = ss; }