金沙澳门官网下载app > 摄影 > HashMap指定初始容量,专业三脚架

原标题:HashMap指定初始容量,专业三脚架

浏览次数:162 时间:2019-12-08

配备参数

  • 特色:缔杰(DIGIPOD) C2530N+BH-52N 铝合金专门的学问三脚架(深橙)(承重 8KG卡塔尔国

翻开完整参数>>

HashMap的钦赐早先容积的结构函数:

原理:程序是依靠Locale来显著国际化能源文件,由此要害之处在于领悟 Struts2 框架是如何分明 Local 对象的 !

public HashMap(int initialCapacity, float loadFactor) 

鉴于Struts2 使用 i18n 拦截器管理国际化,並且将其登记在暗许的拦截器中,由此,能够因此翻阅 I18N 拦截器知道。

起头体积是依照参数 initialCapacity,求出 大于等于 initialCapacity 的纤维的 2的N次方。

现实规定 Locale 对象的经过:

容积是2的N次方的来由,可参见 

> Struts2 接受 i18n 拦截器 管理国际化,并且将其注册在暗许的拦截器栈中

 

> i18n拦截器在推行Action方法前,自动找寻央浼中一个名叫 request_locale 的参数。

1、在JDK低版本中,通过巡回移位运算,有限支撑了起先体量为2的N次方

 假诺该参数存在,拦截器就将其作为参数,调换到Locale对象,并将其设为客商暗许的Locale(代表国家/语言景况卡塔尔(قطر‎。
 并把其设置为 session 的 WW_TRANS_I18N_LOCALE 属性

public HashMap(int initialCapacity, float loadFactor) {  
    ......

    int capacity = 1;  
    while (capacity < initialCapacity)  
        capacity <<= 1;  

    ...... 
}

> 若 request 没著名称叫request_locale 的参数,则 i18n 拦截器会从 Session 中获得 WW_TRANS_I18N_LOCALE 的属性值,
 若该值不为空,则将该属性值设置为浏览者的暗中同意Locale

 

> 若 session 中的 WW_TRANS_I18N_LOCALE 的属性值为空,则从 ActionContext 中赢得 Locale 对象。

2、JDK1.第88中学,对该运算拓宽了优化

流程图如下图所示:

public HashMap(int initialCapacity, float loadFactor) {
    ......
    this.threshold = tableSizeFor(initialCapacity);
}

static final int tableSizeFor(int cap) {
    int n = cap - 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;
}

图片 1

2.1 参数不是2的N次方,转为二进制

 

1xxxxxxxx (假若9位,x中至罕见七个为1卡塔尔(英语:State of Qatar),大于等于该数的一丝一毫2的N次方如下,十一位

实际落实: 只须要在超连接的背后附上 request_locale 的乞请参数, 值是 语言国家 代码.

1000000000

<a href="testI18n.action?request_locale=en_US">English</a>
<a href="testI18n.action?request_locale=zh_CN">中文</a>

首先步 1xxxxxxxx - 1,由于未有至稀有一个1,所以减1后,位数不改变

> 注意: 超链接必需是三个 Struts2 的倡议(经过Action试行), 固然 i18n 拦截器职业!

其次步 n |= n >>> 1;   1xxxxxxxx 右移一个人 产生 1xxxxxxx, 或运算后化作 11xxxxxxx ,不管低位

其三步 n |= n >>> 2;   11xxxxxxx 右移两位 形成 11xxxxx, 或运算后改为 1111xxxxx ,不管低位 

第四步 n |= n >>> 4;   1111xxxxx 右移二人 形成 1111x, 或运算后改为 11111111x ,不管低位

...... 

最终能确定保障具备未有上都是1: 1xxxxxxxx -> 111111111 。 +1 变为 1000000000 ,是当先等于该数的小不点儿2的N次方

右移或运算,甘休到16,能作保最多三拾贰位上都以1,是因为int型的最大值231-1,是31位

2.2 参数是2的N次方

比如1000, n-1后成为 111,右移或运算后大概 111, +1后产生1000

 

3、比较

低版本中,若是传参为2的N次方,比较 + 位移,豆蔻梢头共总括了 2 * N 次

JDK1.第88中学,减法 + 位移 + 或运算,大致总计 11 次

也正是说,钦命数组容积当先 2的6次方(64)后,JDK1.8的频率越来越高

 

4、传参适逢其会为2的N次方时的优化

万意气风发三个数n,其不为1,且n-1 & n = 0,那么n就是一个2的平头次幂

JDK1.8里加那么些判定可以减去总结

static final int tableSizeFor(int cap) {
    int n = cap - 1;

    if(cap & n == 0) // 传参为2的N次方
        return (cap >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : cap;

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

  

 

本文由金沙澳门官网下载app发布于摄影,转载请注明出处:HashMap指定初始容量,专业三脚架

关键词:

上一篇:伟峰 FT6662A

下一篇:没有了