摄影专区

当前位置:金沙7868com > 摄影专区 > HashMap指定初始容量金沙7868com:,专业三脚架

HashMap指定初始容量金沙7868com:,专业三脚架

来源:http://www.jilawu.com 作者:金沙7868com 时间:2019-11-12 19:37

配置参数

  • 特色:缔杰(DIGIPOD) C2530N+BH-52N 铝合金 专业三脚架(黑色)(承重 8KG)

查看完整参数>>

...... 

原理:程序是根据Locale来确定国际化资源文件,因此关键之处在于知道 Struts2 框架是如何确定 Local 对象的 !

4、传参恰好为2的N次方时的优化

由于Struts2 使用 i18n 拦截器处理国际化,并且将其注册在默认的拦截器中,因此,可以通过阅读 I18N 拦截器知道。

第一步 1xxxxxxxx - 1,由于低位至少有一个1,所以减1后,位数不变

> 若 request 没有名为request_locale 的参数,则 i18n 拦截器会从 Session 中获取 WW_TRANS_I18N_LOCALE 的属性值,
 若该值不为空,则将该属性值设置为浏览者的默认Locale

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

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

    ...... 
}

> i18n拦截器在执行Action方法前,自动查找请求中一个名为 request_locale 的参数。

3、比较

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

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

> Struts2 使用 i18n 拦截器 处理国际化,并且将其注册在默认的拦截器栈中

如果一个数n,其不为1,且n-1 & n = 0,那么n就是一个2的整数次幂

 

1、在JDK低版本中,通过循环移位运算,保证了初始容量为2的N次方

具体实现: 只需要在超连接的后面附着 request_locale 的请求参数, 值是 语言国家 代码.

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

 如果该参数存在,拦截器就将其作为参数,转换成Locale对象,并将其设为用户默认的Locale(代表国家/语言环境)。
 并把其设置为 session 的 WW_TRANS_I18N_LOCALE 属性

 

具体确定 Locale 对象的过程:

 

金沙7868com 1

JDK1.8中,减法 + 位移 + 或运算,大概计算 11 次

流程图如下图所示:

举例 1000, n-1后变为 111,右移或运算后还是 111, +1后变为 1000

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

低版本中,假设传参为2的N次方,比较 + 位移,一共计算了 2 * N 次

> 注意: 超链接必须是一个 Struts2 的请求(经过Action执行), 即使 i18n 拦截器工作!

1000000000

 

  

2、JDK1.8中,对该运算进行了优化

JDK1.8里加这个判断可以减少计算

右移或运算,截止到16,能保证最多32位上都是1,是因为int型的最大值231-1,是31位

HashMap的指定初始容量的构造函数:

1xxxxxxxx (假设9位,x中至少有一个为1),大于等于该数的最小2的N次方如下,十位

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

容量是2的N次方的原因,可参见 

 

第二步 n |= n >>> 1;   1xxxxxxxx 右移一位 变成 1xxxxxxx, 或运算后变为 11xxxxxxx ,不管低位

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;
}
public HashMap(int initialCapacity, float loadFactor) 

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

最终能保证所有低位上都是1: 1xxxxxxxx -> 111111111 。 +1 变为 1000000000 ,是大于等于该数的最小2的N次方

 

也就是说,指定数组容量大于 2的6次方(64)后,JDK1.8的效率更高

2.2 参数是2的N次方

初始容量是根据参数 initialCapacity,求出 大于等于 initialCapacity 的最小的 2的N次方。

本文由金沙7868com发布于摄影专区,转载请注明出处:HashMap指定初始容量金沙7868com:,专业三脚架

关键词: