(JAVA)ConcurrentHashMap initialCapacity 手动计算初始化容量大小过程

(JAVA)ConcurrentHashMap initialCapacity 手动计算初始化容量大小过程

package com.lius.test;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * (JAVA)ConcurrentHashMap initialCapacity 手动计算初始化容量大小过程
 * 
 * 第一步:int cap = ((initialCapacity>=(MAXIMUM_CAPACITY/2))?MAXIMUM_CAPACITY:
 * 							initialCapacity+(initialCapacity/2) + 1);
 * initialCapacity如果大于最大值的一半,cap直接取最大值,否则取initialCapacity+initialCapacity/2再+1的值作为cap变量值
 * 第二部: cap = (cap-1)|/2|/4|/8|/16|/32;  解释:|/ => [cap/=2; cap|=cap;]
 * cap先自减1,然后除以2在进行或运算,...除以32再进行或运算,取最终结果
 * 第三步: cap = (cap<0)?1:(cap>=MAXIMUM_CAPACITY)?MAXIMUM_CAPACITY:cap+1;  
 * 如果cap小于0,cap取1,如果大于最大值,cap就取最大值,如果cap在0与最大值之间,cap就取cap+1
 * @author lius
 */
public class testMap {
	private static final int MAXIMUM_CAPACITY = 0x40000000;
	//initialCapacity = 64
	private Map<String,Object> mapContainer = new ConcurrentHashMap<>(64);

	//mainProgram Point
public static void main(String[] args) {
	
	testMap tMap = new testMap();
	tMap.run();
}

private void run() {
	//initialCapacity = 64
	int initialCapacity = 64;
	//MAXIMUM_CAPACITY >>> 1  equals MAXIMUM_CAPACITY/=2;
	//initialCapacity >>> 1   equals initialCapacity/=2;
	/**
	 * int cap = ((initialCapacity  >= (MAXIMUM_CAPACITY/2)) ?
            MAXIMUM_CAPACITY :
            	initialCapacity + (initialCapacity/2) + 1);
	 */
	//int cap = 64+(64/2+1);    97
	int cap = ((initialCapacity  >= (MAXIMUM_CAPACITY >>> 1)) ?
            MAXIMUM_CAPACITY :
            	initialCapacity + (initialCapacity >>> 1) + 1);
	//cap = (cap-1)|/2|/4|/8|/16|/32; 
	cap = tableSizeFor(cap);
}
//
private static final int tableSizeFor(int c) {
    /**
     * n = (n-1)|/2|/4|/8|/16|/32; 
     */
	int n = c - 1;//	n = c-1;
    n |= n >>> 1; //	n/=2;  96|48  0b1100000|0b0110000 => 0b1110000  112
    n |= n >>> 2; //	n/=4;  112|28 0b1110000|0b0011100 => 0b1111100  124
    n |= n >>> 4; //	n/=8;  124|31 0b1111100|0b0011111 => 0b1111111	127
    n |= n >>> 8; //    n/=16; 127|7  0b1111111|0b0000111 => 0b1111111  127
    n |= n >>> 16;//    n/=32; 127|3  0b1111111|0b0000011 => 0b1111111  127
    //n == 127; 127<0?1:(n>=max?max:127+1) => 128
    return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
    //return 128;
}
}

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值