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;    }